美文网首页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