近期开发会有涉及铃音播放,所以深入研究了下当前项目中的系统响铃
当前项目中使用了4个本地系统铃音:
define KSSoundIDChord 0x000003EF
define KSSoundIDRinging 0x0000047F
define KSSoundIDSAssign 0x00000518
define KSSoundIDSMessage 0x000003EB
它们分别的用处如下:
KSSoundIDChord 用于推送消息通知提示
KSSoundIDRinging 用于远程视频声音提示
KSSoundIDSAssign 用于会话处理声音提示
KSSoundIDSMessage 用于聊天声音提示
有趣的事情来了,拨动手机左上角的开关,并调整手机铃声使手机处于静音模式时,按照常理来说,不应该再有铃音响起,但是唯独KSSoundIDSAssign却依然能播放响铃。
继续深入研究代码播放流程,发现它们都走的是同样的接口:
AudioServicesPlaySystemSound()
所以逻辑上不可能有错误,那估计就是系统自带音频的问题了。
但都它们是以16进制方式获取的系统声音,找了半天也找不到它们的出处,所以无法区分它们的具体类别。
于是将他们转化为10进制,分别对应如下:
define KSSoundIDChord 1007
define KSSoundIDRinging 1151
define KSSoundIDSAssign 1304
define KSSoundIDSMessage 1003
再通过多方面查找发现了iOS系统铃音类别对照表:
http://iphonedevwiki.net/index.php/AudioServices
进行对比音频ID,其详细对应类别结果如下:
SoundID File name(iPhone) File name(iPod Touch) Category
1003 ReceivedMessage.caf ReceivedMessage.caf SMSReceived
1007 sms-received1.caf sms-received1.caf SMSReceived_Alert
1151 vc~ringing.caf vc~ringing.caf VCRinging
1304 alarm.caf sq_alarm.caf SystemSoundPreview
发现KSSoundIDSAssign对应的音频类别是:
由于SystemSoundPreview为系统声音预览,alarm.caf为闹钟类长铃音,权限更高,不受系统静音的约束,所以它能响铃
由此可见,iOS中决定系统铃音是否响铃还受系统音频的权限级别影响
网友评论