美文网首页ios 开发
iOS实现类似微信来电的响铃和连续震动功能

iOS实现类似微信来电的响铃和连续震动功能

作者: mingmingsky | 来源:发表于2019-10-18 11:56 被阅读0次

人丑话不多。

官方的震动接口很简单。两步:

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

相关文章

网友评论

    本文标题:iOS实现类似微信来电的响铃和连续震动功能

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