问题描述
AudioServicesPlaySystemSound(1104)
和轻微的触觉:
self.FeedbackGenerator = [[UISelectionFeedbackGenerator alloc] init];
[self.FeedbackGenerator prepare];
//then later
[self.FeedbackGenerator selectionChanged];
这工作正常,除非用户的声音->系统触觉设置关闭。在这种情况下,声音播放比应有的响度大得多。如果我从代码中删除触觉调用,声音会正常播放。
我已经在 iPhone 11 Pro/iOS 14.4.1 上确认了上述内容,但我在其他 iOS 14 iPhone 上收到了相关报告。一位使用 iOS 13 的测试人员没有遇到此问题。
声音/触觉的顺序不会改变结果。
如果我将其中一个延迟 0.25 秒,一切正常,但延迟太长(听起来或感觉不对)。如果我使用很短的延迟(例如 0.01 秒),就会出现问题。
根据 iOS: How to check is Haptic Feedback enabled (iOS Settings),无法检测系统触觉设置的状态,否则如果禁用,我会跳过触觉步骤。
Apple 提供了这一点,表明声音和触觉应该协同工作:
如果您想在触觉反馈中包含声音,您需要手动播放声音并将其与触觉同步。 - https://developer.apple.com/documentation/uikit/uifeedbackgenerator
知道这里发生了什么吗?预期行为? iOS漏洞?解决方法?
解决方法
我已经解决了这个问题: 音频服务PlaySystemSoundWithCompletion() 代替 音频服务PlaySystemSound()
特别是我正在使用:
SystemSoundID soundId = 1104;
AudioServicesPlaySystemSoundWithCompletion(soundId,^{
[self.feedbackGenerator selectionChanged];
AudioServicesRemoveSystemSoundCompletion(soundId);
AudioServicesDisposeSystemSoundID(soundId);
});
触觉会因声音的持续时间而延迟,但它的声音非常短,因此在此用例中不太明显。
(我不认为有必要为内置声音创建然后销毁 SystemSoundID,但在这里采取安全的方法。)
AudioServicesPlaySystemSoundWithCompletion 是在 iOS 9 中添加的。这里的原始代码(触觉除外)可以追溯到 iOS 3 或 4。标题说 AudioServicesPlaySystemSound“将在未来版本中被弃用。改用 AudioServicesPlaySystemSoundWithCompletion。”我希望他们实际上已经弃用了它,所以我会注意到这种方法甚至存在......新版本肯定更有用。