微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AudioServicesPlaySystemSound 和 System Haptics 交互

如何解决AudioServicesPlaySystemSound 和 System Haptics 交互

在 iOS 应用中,我有一个交互,我想同时播放敲击声:

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。”我希望他们实际上已经弃用了它,所以我会注意到这种方法甚至存在......新版本肯定更有用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。