iOS VoIP实践

作者: Iam光星人 | 来源:发表于2018-08-28 18:38 被阅读307次

    简介

    PushKit是苹果在iOS8之后推出的新框架,iOS10之后,苹果更是禁止VOIP应用在后台使用socket长链接,PushKit可以说是为了VOIP而生,满足实时性的同时,还能达到省电的效果,搭配苹果自己的CallKit,可以呈现出类似原生电话通话的效果。
    远程推送和本地推送:
    区别网上资料太多了,简单说一下,比如今日头条,有什么大的新闻会在手机端接收到推送,这个就是远程推送,是把相关信息推送到苹果推送服务器-APNS。本地推送就是在本地设定一个时间,其实就是一个类似闹钟的功能,当到了设定的时间,就会收到一条推送,这个是和推送服务器没有关系的。

    VOIP可以搭配本地推送完美代替APNS推送功能,同时更加强大,在app未开启状态就可以执行代码,具体测试可以唤醒近30秒,而且无需授权,我们在回调里直接加上本地推送完全可以是实现APNS功能,这样的黑科技想象就很激动,让我们赶紧来试一下吧!

    VoIP Push Notification

    1.注册推送证书

    该证书只要选择对应的bundleID,勾选创建对应的 VoIP选项即可;注意该证书不分生产测试,后端只需更换证书流程和接入APNS一样,即刻调起:


    8014766-d7af7a139a2c8551.png

    2.项目配置 8014766-190ef547eb0f3de9.png

    3.plistInfo配置

    屏幕快照 2018-08-28 下午6.19.25.png 屏幕快照 2018-08-28 下午6.19.40.png

    4.代码配置

    导入需要的头文件

    #import <PushKit/PushKit.h>
    #import <UserNotifications/UserNotifications.h>
    #import <AudioToolbox/AudioToolbox.h>
    
    

    注册本地通知设置代理

     PKPushRegistry *pushRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()];
        pushRegistry.delegate = self;
        pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];
        //ios10注册本地通知
        if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
            //iOS 10
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
            if (!error) {
                NSLog(@"request authorization succeeded!");
            }
        }];
        [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
            NSLog(@"%@",settings);
        }];
        }
    

    代理实现
    在代理方法didReceiveIncomingPushWithPayload里可以实现你要在30秒内完成的任务(注意该任务可以在点击你本地通知唤醒后继续执行,类似微信视频呼叫)

    #pragma mark -pushkitDelegate
    
    - (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(NSString *)type{
        if([credentials.token length] == 0) {
            NSLog(@"voip token NULL");
            return;
        }
        //应用启动获取token,并上传服务器
        token = [[[[credentials.token description] stringByReplacingOccurrencesOfString:@"<"withString:@""]
                  stringByReplacingOccurrencesOfString:@">" withString:@""]
                 stringByReplacingOccurrencesOfString:@" " withString:@""];
        //token上传服务器
        //[self uploadToken];
    }
    
    - (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type{
        if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
            UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
            UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init];
            content.body =[NSString localizedUserNotificationStringForKey:[NSString
                                                                           stringWithFormat:@"%@%@", CallerName,
                                                                           @"邀请你进行通话。。。。"] arguments:nil];;
            UNNotificationSound *customSound = [UNNotificationSound soundNamed:@"voip_call.caf"];
            content.sound = customSound;
            UNTimeIntervalNotificationTrigger* trigger = [UNTimeIntervalNotificationTrigger
                                                          triggerWithTimeInterval:1 repeats:NO];
            request = [UNNotificationRequest requestWithIdentifier:@"Voip_Push"
                                                           content:content trigger:trigger];
            [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
                NSLog(@"结束");
            }];
        }else {
    
            callNotification = [[UILocalNotification alloc] init];
            callNotification.alertBody = [NSString
                                          stringWithFormat:@"%@%@", CallerName,
                                          @"邀请你进行通话。。。。"];
    
            callNotification.soundName = @"voip_call.caf";
            [[UIApplication sharedApplication]
             presentLocalNotificationNow:callNotification];
    
        }
        /**
         初始化计时器  每一秒振动一次
         @param playkSystemSound 振动方法
         @return
         */
        if(_vibrationTimer){
            [_vibrationTimer invalidate];
            _vibrationTimer = nil;
        }else{
            _vibrationTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(playkSystemSound) userInfo:nil repeats:YES];
        }
        }
        
    }
    //振动
    - (void)playkSystemSound{
            AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
    }
    

    结语

    近期实现VoIP功能做一些记录,希望能帮到大家,有问题可以积极交流,谢谢!

    相关文章

      网友评论

        本文标题:iOS VoIP实践

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