首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AudioServicesPlaySystemSound与系统Haptics相互作用

AudioServicesPlaySystemSound与系统Haptics相互作用
EN

Stack Overflow用户
提问于 2021-03-19 19:17:02
回答 1查看 357关注 0票数 1

在一个iOS应用程序中,我有一个交互,在这里我想同时播放一个点击声音:

代码语言:javascript
复制
AudioServicesPlaySystemSound(1104)

一种轻微的触觉:

代码语言:javascript
复制
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窃听器?解决办法?

EN

回答 1

Stack Overflow用户

发布于 2021-03-19 19:54:50

我使用了: AudioServicesPlaySystemSoundWithCompletion()而不是AudioServicesPlaySystemSound()来解决这个问题。

具体来说,我用的是:

代码语言:javascript
复制
SystemSoundID soundId = 1104;
AudioServicesPlaySystemSoundWithCompletion(soundId, ^{
    [self.feedbackGenerator selectionChanged];
    AudioServicesRemoveSystemSoundCompletion(soundId);
    AudioServicesDisposeSystemSoundID(soundId);
});

触觉被声音的持续时间所延迟,但是在这个用例中它是一个非常短的声音,所以不太明显。

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

AudioServicesPlaySystemSoundWithCompletion是在iOS 9中添加的。这里的原始代码(除了触觉)可以追溯到iOS 3或4。标题说AudioServicesPlaySystemSound“将在以后的版本中被废弃。使用AudioServicesPlaySystemSoundWithCompletion代替。”我希望他们真的反对,所以我会注意到这种方法甚至存在.更新的版本当然更有用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66714376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档