AudioServicesPlaySystemSound(kSystemSoundID_Vibrate) 不生效

最近在做一个项目用到系统震动,最合适满足需求的是 iOS系统 api 提供的 AudioServicesPlaySystemSound(kSystemSoundID_Vibrate),于是就高兴的调用了这强大的函数;比较诡异的是当把手机打开震动反馈与铃音提示,开始一直不震动最后查看官网的说法:



根据官方文档说法有些设备不支持,但我的设备是 iOS14,并且是iPhone11 这个设备单独运行demo是可以震动的,但为什么在项目里不震动呢???

开始探索,在调用AudioServicesPlaySystemSound 之前我打印了下 AVAudioSession.sharedInstance().category 发现是 当前的category是 playAndRecord 于是查在此category下是否有问题,在category record 与playAndRecord 下不生效,这下暂时死心了,但后来发现在某些场景下 AVAudioSession的category同样是  playAndRecord 可以震动!!再次感到诡异!不是不能震动吗? 于是乎有查啊查,看除了category还有没有其他影响震动生效的,黄天不负有心人,最终发现 AVAudioSession 里有个mode,当category为 playAndRecord,mode为 defualt时,震动不生效,当我把mode 设置成 voiceChat 时可以震动!!!

于是终于解决了问题,话说这样无脑的将mode 设置成voiceChat 会有影响吗?

于是查了官方文档关于  voiceChat 的解释 https://developer.apple.com/documentation/avfoundation/avaudiosession/mode/1616455-voicechat  原来这个mode是对多路音频的优化,即使不手动设置 voiceChat,如果用了Voice-Processing I/O 模块,系统也会将mode隐式设置成 voiceChat,如果预先设置了为voiceChat,且用了Voice-Processing I/O 的api mode不会改变,原文如下:



最后可以愉快的将 AVAudioSession 的mode 改成 voiceChat了,然后 AudioServicesPlaySystemSound(kSystemSoundID_Vibrate) 运行正常了!!!问题解决!

你可能感兴趣的:(AudioServicesPlaySystemSound(kSystemSoundID_Vibrate) 不生效)