1

在 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:如何检查是否启用了触觉反馈(iOS 设置),无法检测系统触觉设置的状态,否则如果禁用,我会跳过触觉步骤。

Apple 提供了这一点,表明声音和触觉应该协同工作:

如果您想在触觉反馈中包含声音,则需要手动播放声音并将其与触觉同步。- https://developer.apple.com/documentation/uikit/uifeedbackgenerator

知道这里发生了什么吗?预期的行为?iOS 漏洞?解决方法?

4

1 回答 1

0

我已经通过使用来解决这个问题:AudioServicesPlaySystemSoundWithCompletion() 而不是 AudioServicesPlaySystemSound()

具体来说,我正在使用:

SystemSoundID soundId = 1104;
AudioServicesPlaySystemSoundWithCompletion(soundId, ^{
    [self.feedbackGenerator selectionChanged];
    AudioServicesRemoveSystemSoundCompletion(soundId);
    AudioServicesDisposeSystemSoundID(soundId);
});

触觉会因声音的持续时间而延迟,但它是一个非常短的声音,因此在此用例中并不十分明显。

(我不相信有必要为内置声音创建然后销毁 SystemSoundID,但在这里采取安全的方法。)

AudioServicesPlaySystemSoundWithCompletion 是在 iOS 9 中添加的。这里的原始代码(触觉除外)可以追溯到 iOS 3 或 4。标题说 AudioServicesPlaySystemSound“将在未来的版本中被弃用。改用 AudioServicesPlaySystemSoundWithCompletion。” 我希望他们实际上已经弃用它,所以我会注意到这种方法甚至存在......新版本肯定更有用。

于 2021-03-19T19:54:50.940 回答