人丑话不多。
官方的震动接口很简单。两步:
1.往项目中导入AudiToolbox.framework框架
2.AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);
但是怎么用,效果如何。show me code.
#pragma mark - Ring and Vibration Control
//全局变量
SystemSoundID sound;
//开始播放的时候调用
-(void)startButton_cClickedAction{
//震动的提示文件名放到资源目录下
NSString *path = [[NSBundle mainBundle] pathForResource:@"ring" ofType:@"wav"];
AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath:path], &sound);
//分别注册铃声和震动完后的回调
AudioServicesAddSystemSoundCompletion(kSystemSoundID_Vibrate, NULL, NULL, vibrationCompleteCallback, NULL);
AudioServicesAddSystemSoundCompletion(sound, NULL, NULL, soundCompleteCallback, NULL);
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);//开始震动
AudioServicesPlaySystemSound(sound);//开始播放铃声
}
//手动停止播放的时候调用
- (void)stopButton_cClickedAction {
NSLog(@"stop button action");
stopRingAndVibration();
}
//停止响铃和震动,移除回调并处理掉铃声和震动
void stopRingAndVibration() {
AudioServicesRemoveSystemSoundCompletion(kSystemSoundID_Vibrate);
AudioServicesRemoveSystemSoundCompletion(sound);
AudioServicesDisposeSystemSoundID(kSystemSoundID_Vibrate);
AudioServicesDisposeSystemSoundID(sound);
}
//震动完成回调,因为震动一下便会调用一次,这里延迟800ms再继续震动,和微信差不多,时间长短可自己控制。参数sound即为注册回调时传的第一个参数
void vibrationCompleteCallback(SystemSoundID sound,void * clientData) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(800 * NSEC_PER_MSEC)), dispatch_get_global_queue(0, 0), ^{
AudioServicesPlaySystemSound(sound);
});
}
//铃声播放完成回调,这种方法播放的音频限制在30秒内,播放完直接响铃和震动
void soundCompleteCallback(SystemSoundID sound,void * clientData) {
stopRingAndVibration();
}
以上就是全部代码了。
注意,这个只有在app在前台或后台才有效。那如果app杀掉了怎么办?这时候来电的铃声和震动还有吗?
答案是没有了。那有没有办法?有的。
正常我们用APNS推送,我们可以设置推送的铃声,只要这个铃声和我们app资源文件的名字一致即可播放改铃声。如:
//这是aps的推送内容,只要把default改成ring(对应的音频文件名)即可
"aps" : {
"alert" : "Your message Here",
"sound" : "default",
"badge" : 0
}
那震动了?
抱歉,用APNS推送,不能达到震动的效果。
只有app在运行状态下,我们才可以让app震动。
这时候VoIP推送就出现了。
VoIP推送是什么?自己百度去。简单的说,就是当app被杀掉,这时候VoIP推送可以直接把app从后台拉起来。而不需要用户手动点击app打开。就酱紫。app都拉起来了,你要播放铃声,要震动,so easy。对不?
不过,只从XCode11发布后,用XCode11编译会报错,说是VoIP功能要配合CallKit使用。蛋疼
那怎么办,就再下个XCode10来打包吧。以后的事以后再说。88
网友评论