在一个iOS应用程序中,我有一个交互,在这里我想同时播放一个点击声音:
AudioServicesPlaySystemSound(1104)一种轻微的触觉:
self.feedbackGenerator = [[UISelectionFeedbackGenerator alloc] init];
[self.feedbackGenerator prepare];
//then later
[self.feedbackGenerator selectionChanged];这很好,除非用户的声音->系统Haptics设置是关闭的。在那种情况下,声音比它应该播放的声音大得多。如果我从代码中删除触觉调用,声音就会正常播放。
我已经在iPhone 11 Pro/iOS 14.4.1上证实了上述情况,但我在其他iOS 14 iPhones上也有这方面的报道。一个使用iOS 13的测试人员没有遇到这个问题。
声音/触觉的顺序不会改变结果。
如果我把一个或另一个延迟0.25s,一切都正常,但是这个延迟太长了(听起来不太好,感觉也不对)。如果我使用很短的延迟(比如0.01s),就会出现问题。
根据iOS: How to check is Haptic Feedback enabled (iOS Settings),没有能力检测系统Haptics设置的状态,否则如果禁用,我将跳过触觉步骤。
Apple提供了这一点,表明声音和触觉应该一起工作:
如果你想把声音和触觉反馈放在一起,你需要手动播放声音并与触觉同步。- https://developer.apple.com/documentation/uikit/uifeedbackgenerator
知道这是怎么回事吗?预期的行为?iOS窃听器?解决办法?
发布于 2021-03-19 19:54:50
我使用了: AudioServicesPlaySystemSoundWithCompletion()而不是AudioServicesPlaySystemSound()来解决这个问题。
具体来说,我用的是:
SystemSoundID soundId = 1104;
AudioServicesPlaySystemSoundWithCompletion(soundId, ^{
[self.feedbackGenerator selectionChanged];
AudioServicesRemoveSystemSoundCompletion(soundId);
AudioServicesDisposeSystemSoundID(soundId);
});触觉被声音的持续时间所延迟,但是在这个用例中它是一个非常短的声音,所以不太明显。
(我不认为有必要为内置的声音创建然后销毁SystemSoundID,但在这里采用安全的方法。)
AudioServicesPlaySystemSoundWithCompletion是在iOS 9中添加的。这里的原始代码(除了触觉)可以追溯到iOS 3或4。标题说AudioServicesPlaySystemSound“将在以后的版本中被废弃。使用AudioServicesPlaySystemSoundWithCompletion代替。”我希望他们真的反对,所以我会注意到这种方法甚至存在.更新的版本当然更有用。
https://stackoverflow.com/questions/66714376
复制相似问题