美文网首页ios 开发
iOS 播放系统铃声、震动、自定义铃声以及循环播放

iOS 播放系统铃声、震动、自定义铃声以及循环播放

作者: Fxxxxxxx | 来源:发表于2018-01-18 17:30 被阅读1115次

    前言

    很多时候我们需要播放音频来提醒用户,调用系统铃声是不错的选择,例如自定义一个截图操作,可以调用系统的快门声;做一个VoIP通话服务,可以循环播放一段自定义铃声和震动,然后接通或者挂断时候手动停止,等等

    下文所有的功能均使用系统框架AudioToolbox

    • 播放系统铃声

    func AudioServicesPlaySystemSound(_ inSystemSoundID: SystemSoundID)
    

    使用AudioServicesPlaySystemSound方法,参数是你要播放的SoundID,然后系统会播放这个铃声一次,不会循环播放,系统的soundid表见下表

    Sound ID File name (iPhone) File name (iPod Touch) Category Note
    1000 new-mail.caf new-mail.caf MailReceived
    1001 mail-sent.caf mail-sent.caf MailSent
    1002 Voicemail.caf Voicemail.caf VoicemailReceived
    1003 ReceivedMessage.caf ReceivedMessage.caf SMSReceived
    1004 SentMessage.caf SentMessage.caf SMSSent
    1005 alarm.caf sq_alarm.caf CalendarAlert
    1006 low_power.caf low_power.caf LowPower
    1007 sms-received1.caf sms-received1.caf SMSReceived_Alert
    1008 sms-received2.caf sms-received2.caf SMSReceived_Alert
    1009 sms-received3.caf sms-received3.caf SMSReceived_Alert
    1010 sms-received4.caf sms-received4.caf SMSReceived_Alert
    1011 - - SMSReceived_Vibrate
    1012 sms-received1.caf sms-received1.caf SMSReceived_Alert
    1013 sms-received5.caf sms-received5.caf SMSReceived_Alert
    1014 sms-received6.caf sms-received6.caf SMSReceived_Alert
    1015 Voicemail.caf Voicemail.caf - Available since 2.1
    1016 tweet_sent.caf tweet_sent.caf SMSSent Available since 5.0
    1020 Anticipate.caf Anticipate.caf SMSReceived_Alert Available since 4.2
    1021 Bloom.caf Bloom.caf SMSReceived_Alert Available since 4.2
    1022 Calypso.caf Calypso.caf SMSReceived_Alert Available since 4.2
    1023 Choo_Choo.caf Choo_Choo.caf SMSReceived_Alert Available since 4.2
    1024 Descent.caf Descent.caf SMSReceived_Alert Available since 4.2
    1025 Fanfare.caf Fanfare.caf SMSReceived_Alert Available since 4.2
    1026 Ladder.caf Ladder.caf SMSReceived_Alert Available since 4.2
    1027 Minuet.caf Minuet.caf SMSReceived_Alert Available since 4.2
    1028 News_Flash.caf News_Flash.caf SMSReceived_Alert Available since 4.2
    1029 Noir.caf Noir.caf SMSReceived_Alert Available since 4.2
    1030 Sherwood_Forest.caf Sherwood_Forest.caf SMSReceived_Alert Available since 4.2
    1031 Spell.caf Spell.caf SMSReceived_Alert Available since 4.2
    1032 Suspense.caf Suspense.caf SMSReceived_Alert Available since 4.2
    1033 Telegraph.caf Telegraph.caf SMSReceived_Alert Available since 4.2
    1034 Tiptoes.caf Tiptoes.caf SMSReceived_Alert Available since 4.2
    1035 Typewriters.caf Typewriters.caf SMSReceived_Alert Available since 4.2
    1036 Update.caf Update.caf SMSReceived_Alert Available since 4.2
    1050 ussd.caf ussd.caf USSDAlert
    1051 SIMToolkitCallDropped.caf SIMToolkitCallDropped.caf SIMToolkitTone
    1052 SIMToolkitGeneralBeep.caf SIMToolkitGeneralBeep.caf SIMToolkitTone
    1053 SIMToolkitNegativeACK.caf SIMToolkitNegativeACK.caf SIMToolkitTone
    1054 SIMToolkitPositiveACK.caf SIMToolkitPositiveACK.caf SIMToolkitTone
    1055 SIMToolkitSMS.caf SIMToolkitSMS.caf SIMToolkitTone
    1057 Tink.caf Tink.caf PINKeyPressed
    1070 ct-busy.caf ct-busy.caf AudioToneBusy There was no category for this sound before 4.0.
    1071 ct-congestion.caf ct-congestion.caf AudioToneCongestion There was no category for this sound before 4.0.
    1072 ct-path-ack.caf ct-path-ack.caf AudioTonePathAcknowledge There was no category for this sound before 4.0.
    1073 ct-error.caf ct-error.caf AudioToneError There was no category for this sound before 4.0.
    1074 ct-call-waiting.caf ct-call-waiting.caf AudioToneCallWaiting There was no category for this sound before 4.0.
    1075 ct-keytone2.caf ct-keytone2.caf AudioToneKey2 There was no category for this sound before 4.0.
    1100 lock.caf sq_lock.caf ScreenLocked
    1101 unlock.caf sq_lock.caf ScreenUnlocked
    1102 - - FailedUnlock
    1103 Tink.caf sq_tock.caf KeyPressed
    1104 Tock.caf sq_tock.caf KeyPressed
    1105 Tock.caf sq_tock.caf KeyPressed
    1106 beep-beep.caf sq_beep-beep.caf ConnectedToPower
    1107 RingerChanged.caf RingerChanged.caf RingerSwitchIndication
    1108 photoShutter.caf photoShutter.caf CameraShutter
    1109 shake.caf shake.caf ShakeToShuffle Available since 3.0
    1110 jbl_begin.caf jbl_begin.caf JBL_Begin Available since 3.0
    1111 jbl_confirm.caf jbl_confirm.caf JBL_Confirm Available since 3.0
    1112 jbl_cancel.caf jbl_cancel.caf JBL_Cancel Available since 3.0
    1113 begin_record.caf begin_record.caf BeginRecording Available since 3.0
    1114 end_record.caf end_record.caf EndRecording Available since 3.0
    1115 jbl_ambiguous.caf jbl_ambiguous.caf JBL_Ambiguous Available since 3.0
    1116 jbl_no_match.caf jbl_no_match.caf JBL_NoMatch Available since 3.0
    1117 begin_video_record.caf begin_video_record.caf BeginVideoRecording Available since 3.0
    1118 end_video_record.caf end_video_record.caf EndVideoRecording Available since 3.0
    1150 vc~invitation-accepted.caf vc~invitation-accepted.caf VCInvitationAccepted Available since 4.0
    1151 vc~ringing.caf vc~ringing.caf VCRinging Available since 4.0
    1152 vc~ended.caf vc~ended.caf VCEnded Available since 4.0
    1153 ct-call-waiting.caf ct-call-waiting.caf VCCallWaiting Available since 4.1
    1154 vc~ringing.caf vc~ringing.caf VCCallUpgrade Available since 4.1
    1200 dtmf-0.caf dtmf-0.caf TouchTone
    1201 dtmf-1.caf dtmf-1.caf TouchTone
    1202 dtmf-2.caf dtmf-2.caf TouchTone
    1203 dtmf-3.caf dtmf-3.caf TouchTone
    1204 dtmf-4.caf dtmf-4.caf TouchTone
    1205 dtmf-5.caf dtmf-5.caf TouchTone
    1206 dtmf-6.caf dtmf-6.caf TouchTone
    1207 dtmf-7.caf dtmf-7.caf TouchTone
    1208 dtmf-8.caf dtmf-8.caf TouchTone
    1209 dtmf-9.caf dtmf-9.caf TouchTone
    1210 dtmf-star.caf dtmf-star.caf TouchTone
    1211 dtmf-pound.caf dtmf-pound.caf TouchTone
    1254 long_low_short_high.caf long_low_short_high.caf Headset_StartCall
    1255 short_double_high.caf short_double_high.caf Headset_Redial
    1256 short_low_high.caf short_low_high.caf Headset_AnswerCall
    1257 short_double_low.caf short_double_low.caf Headset_EndCall
    1258 short_double_low.caf short_double_low.caf Headset_CallWaitingActions
    1259 middle_9_short_double_low.caf middle_9_short_double_low.caf Headset_TransitionEnd
    1300 Voicemail.caf Voicemail.caf SystemSoundPreview
    1301 ReceivedMessage.caf ReceivedMessage.caf SystemSoundPreview
    1302 new-mail.caf new-mail.caf SystemSoundPreview
    1303 mail-sent.caf mail-sent.caf SystemSoundPreview
    1304 alarm.caf sq_alarm.caf SystemSoundPreview
    1305 lock.caf sq_lock.caf SystemSoundPreview
    1306 Tock.caf sq_tock.caf KeyPressClickPreview The category was SystemSoundPreview before 3.2.
    1307 sms-received1.caf sms-received1.caf SMSReceived_Selection
    1308 sms-received2.caf sms-received2.caf SMSReceived_Selection
    1309 sms-received3.caf sms-received3.caf SMSReceived_Selection
    1310 sms-received4.caf sms-received4.caf SMSReceived_Selection
    1311 - - SMSReceived_Vibrate
    1312 sms-received1.caf sms-received1.caf SMSReceived_Selection
    1313 sms-received5.caf sms-received5.caf SMSReceived_Selection
    1314 sms-received6.caf sms-received6.caf SMSReceived_Selection
    1315 Voicemail.caf Voicemail.caf SystemSoundPreview Available since 2.1
    1320 Anticipate.caf Anticipate.caf SMSReceived_Selection Available since 4.2
    1321 Bloom.caf Bloom.caf SMSReceived_Selection Available since 4.2
    1322 Calypso.caf Calypso.caf SMSReceived_Selection Available since 4.2
    1323 Choo_Choo.caf Choo_Choo.caf SMSReceived_Selection Available since 4.2
    1324 Descent.caf Descent.caf SMSReceived_Selection Available since 4.2
    1325 Fanfare.caf Fanfare.caf SMSReceived_Selection Available since 4.2
    1326 Ladder.caf Ladder.caf SMSReceived_Selection Available since 4.2
    1327 Minuet.caf Minuet.caf SMSReceived_Selection Available since 4.2
    1328 News_Flash.caf News_Flash.caf SMSReceived_Selection Available since 4.2
    1329 Noir.caf Noir.caf SMSReceived_Selection Available since 4.2
    1330 Sherwood_Forest.caf Sherwood_Forest.caf SMSReceived_Selection Available since 4.2
    1331 Spell.caf Spell.caf SMSReceived_Selection Available since 4.2
    1332 Suspense.caf Suspense.caf SMSReceived_Selection Available since 4.2
    1333 Telegraph.caf Telegraph.caf SMSReceived_Selection Available since 4.2
    1334 Tiptoes.caf Tiptoes.caf SMSReceived_Selection Available since 4.2
    1335 Typewriters.caf Typewriters.caf SMSReceived_Selection Available since 4.2
    1336 Update.caf Update.caf SMSReceived_Selection Available since 4.2
    1350 - - RingerVibeChanged
    1351 - - SilentVibeChanged
    4095 - - Vibrate There was no category for this sound before 2.2.In the SDK this is the constant kSystemSoundID_Vibrate
    • 播放自定义铃声

    首先把要播放的音频文件放到工程里,Bundle读取url之后,用AudioServicesCreateSystemSoundID方法获取我们这个音频注册之后的SystemSoundID,就可以用AudioServicesPlaySystemSound直接播放出来了,这里我们假定播放注册一个名为“sound.m4a”的音频文件

    var soundId: SystemSoundID = SystemSoundID()
    let path = Bundle.main.path(forResource: "sound", ofType: "m4a")
    let url = URL.init(fileURLWithPath: path!)
    AudioServicesCreateSystemSoundID(url as CFURL, &soundId)
    AudioServicesPlaySystemSound(soundId)
    
    • 循环播放

    @available(iOS 2.0, *)
    public func AudioServicesAddSystemSoundCompletion(_ inSystemSoundID: SystemSoundID, _ inRunLoop: CFRunLoop?, _ inRunLoopMode: CFString?, _ inCompletionRoutine: @escaping AudioToolbox.AudioServicesSystemSoundCompletionProc, _ inClientData: UnsafeMutableRawPointer?) -> OSStatus
    

    使用AudioServicesAddSystemSoundCompletion方法,可以为一个SystemSoundID绑定一个播放完成之后的回调,我们可以在回调里继续播放这个SystemSoundID,播放后会继续回到回调,这样就做到了循环播放的效果,记住,这个方法是全局的,如果你为一个SystemSoundID绑定过回调之后,不取消的话,其他地方播放这个SystemSoundID也会进入回调,所以停止播放时记得用AudioServicesRemoveSystemSoundCompletion方法移除回调绑定。至于停止播放,使用AudioServicesDisposeSystemSoundID方法传入SystemSoundID就可以了。全部的示例代码看下面

        var soundId: SystemSoundID?
    
        //注册音频文件,获取SystemSoundID
        func getSoundId() -> SystemSoundID {
            
            var soundId: SystemSoundID = SystemSoundID()
            let path = Bundle.main.path(forResource: "sound", ofType: "m4a")
            let url = URL.init(fileURLWithPath: path!)
            AudioServicesCreateSystemSoundID(url as CFURL, &soundId)
            return soundId
            
        }
        
        //播放自定义铃声和震动
        func playAlertSound() {
            
            if soundId == nil {
                soundId = self.getSoundId()
            }
            
            AudioServicesAddSystemSoundCompletion(soundId!, nil, nil, { (SystemSoundID, pointer: UnsafeMutableRawPointer?) in
    
                AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
                AudioServicesPlaySystemSound(SystemSoundID)
    
            }, nil)
            //kSystemSoundID_Vibrate是震动的id
            AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
            AudioServicesPlaySystemSound(soundId!)
            
        }
        
        //停止播放
        func stopAlertSoundWithSoundID() {
            
            if soundId != nil {
                AudioServicesDisposeSystemSoundID(soundId!)
                AudioServicesRemoveSystemSoundCompletion(soundId!)
                soundId = nil
            }
            
            AudioServicesDisposeSystemSoundID(kSystemSoundID_Vibrate)
            
        }
    

    欢迎更正错误和交流,回复评论和私信皆可 😊

    相关文章

      网友评论

        本文标题:iOS 播放系统铃声、震动、自定义铃声以及循环播放

        本文链接:https://www.haomeiwen.com/subject/ckmwoxtx.html