github 地址:https://github.com/FledglingBoy/AJSoundManager
废话不多说,直接上代码:
AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath:ringpath], &m_RingSound);//ringpath是音频路径,这句话是判定m_RingSound与ringpath音频
AudioServicesAddSystemSoundCompletion(kSystemSoundID_Vibrate, NULL, NULL, ajsoundCompleteCallback, NULL);//这句话是注册回调,kSystemSoundID_Vibrate是系统固定的震动类型的soudid,ajsoundCompleteCallback是回调函数,
//在每次一震动完成之后会调用ajsoundCompleteCallback回调,注意这里ajsoundCompleteCallback是c的方法。(按自己的需求,kSystemSoundID_Vibrate这个可以改成m_RingSound,这样就是播放完m_RingSound的音频之后回调ajsoundCompleteCallback)
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);//执行震动
AudioServicesPlaySystemSound(m_RingSound);//播放音频
-(void)ajVibrate
{
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);//执行震动
}
void ajsoundCompleteCallback(SystemSoundID sound,void * clientData) {
[selfAJSoundManager performSelector:@selector(ajVibrate) withObject:nil afterDelay:1];//如果在这里直接再调用震动的话,震动就会比较连续,用户体验不好,所以在这里延迟1秒再震动。
// AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); //震动
// AudioServicesPlaySystemSound(sound); // 播放系统声音
}
具体还有不清楚的可以查看github里工具类,直接调用
[[AJSoundManager getInstance] startIncomingCallRing:AJRingTypeSystemRing];
就可以实现震动与播放音频,音频文件是21s,21s后就停止播放了,如果要继续播放的话自己再处理一下了。要一直播放音频的思路也有两种,一种是既然知道音频多少秒,做个定时器,然后几秒之后再播放。另外一种是给一段大概两秒的音频,然后AudioServicesAddSystemSoundCompletion里面绑定音频,让音频播放完成后执行回调ajsoundCompleteCallback,在回调里面再调用AudioServicesPlaySystemSound播放音频和震动。
调用[[AJSoundManager getInstance] stopIncomingCallRing];暂停震动与音频播放