美文网首页
iOS --使用Voip实现语音播报功能

iOS --使用Voip实现语音播报功能

作者: 十元不卖 | 来源:发表于2019-07-23 18:08 被阅读0次

    公司需求,实现类似支付宝一样的后台语音播报功能,之前用Notification Server Extension写的.现在用Apple 的Voip重现实现了一下,目前是前台的时候可以播报,缩进后台或者杀掉进程之后只能收到通知,不能播放语音了,这个明天优化,测试ok之后再发demo!

    星爷镇楼

    第一步:创建voip证书

    第二部:打开Xcode后台模式的voip权限


    第三步:证书合成等待使用

    制作.pem格式证书

    1、将之前生成的voip.cer SSL证书双击导入钥匙串

    2、打开钥匙串访问,在证书中找到对应voip.cer生成的证书,右键导出并选择.p12格式,这里我们命名为voippush.p12,这里导出需要输入密码(随意输入,别忘记了)。

    3、目前我们有两个文件,voip.cer SSL证书和voippush.p12私钥,新建文件夹命名为VoIP、并保存两个文件到VoIP文件夹。

    4、把.cer的SSL证书转换为.pem文件,打开终端命令行cd到VoIP文件夹、执行以下命令

    openssl x509 -in voip.cer -inform der -out VoiPCert.pem

    5、把.p12私钥转换成.pem文件,执行以下命令(这里需要输入之前导出设置的密码)

    openssl pkcs12 -nocerts -out VoIPKey.pem -in voippush.p12

    6、再把生成的两个.pem整合到一个.pem文件中

    cat VoiPCert.pem VoIPKey.pem > ck.pem

    最终生成的ck.pem文件一般就是服务器用来推送的。

    第四步:写代码

    注意点:

    1.导入PushKit框架

    2.遵守PKPushRegistryDelegate

    3.发送的token是PKPushRegistry记录的token,不再是推送的token,加粗表示重要

    - (void)initPushkit{

        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) {

            [self registerUserNotificationCenter];

        }

    }

    - (void)registerUserNotificationCenter {

        if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {

            //iOS10特有

            UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];

            // 必须写代理,不然无法监听通知的接收与点击

            [centerrequestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionBadge | UNAuthorizationOptionSound) completionHandler:^(BOOL granted, NSError * _Nullable error) {

                if(granted) {

                    // 点击允许

                    NSLog(@"注册成功");

                    [centergetNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {

                        NSLog(@"%@", settings);

                    }];

                }else{

                    // 点击不允许

                    NSLog(@"注册失败");

                }

            }];

        }

    }

    //应用启动此代理方法会返回设备Token 、一般在此将token上传服务器

    - (void)pushRegistry:(PKPushRegistry*)registry didUpdatePushCredentials:(PKPushCredentials*)credentials forType:(NSString*)type{

        NSLog(@"应用启动此代理方法会返回设备Token 、一般在此将token上传服务器");

        NSString * token = [[[[credentials.token description] stringByReplacingOccurrencesOfString:@"<" withString:@""] stringByReplacingOccurrencesOfString:@">" withString:@""] stringByReplacingOccurrencesOfString:@" " withString:@""];

    //    self.clientId = token;//[token stringByReplacingOccurrencesOfString:@" " withString:@""];

        NSLog(@"token=%@",token);

    }

    //当VoIP推送过来会调用此方法,一般在这里调起本地通知实现连续响铃、接收视频呼叫请求等操作

    - (void)pushRegistry:(PKPushRegistry*)registry didReceiveIncomingPushWithPayload:(PKPushPayload*)payload forType:(NSString*)type {

        NSLog(@"当VoIP推送过来会调用此方法,一般在这里调起本地通知实现连续响铃、接收视频呼叫请求等操作");

        [self showLocalNotification:payload.dictionaryPayload];

        [selfaddOperation:@"XXX收款100.99元"sound_type:@""];

    }

    /**

     当APP收到呼叫、处于后台时调用、用来处理通知栏类型和铃声。

     */

    - (void)showLocalNotification:(NSDictionary*)userInfo {

        if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {

            UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];

            UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];

            content.body = [NSString localizedUserNotificationStringForKey:@"您的账户收到一笔巨款" arguments:nil];

            UNNotificationSound *customSound = [UNNotificationSound defaultSound];

            content.sound= customSound;

            UNTimeIntervalNotificationTrigger* trigger = [UNTimeIntervalNotificationTrigger

                                                          triggerWithTimeInterval:1repeats:NO];

            UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"voippush"

                                                           content:contenttrigger:trigger];

            [centeraddNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {

            }];

        }else{

            UILocalNotification *callNotification = [[UILocalNotification alloc] init];

            callNotification.alertBody= [NSString

                                          stringWithFormat:@"您的账户收到一笔巨款"];

            callNotification.soundName=@"default";

            [[UIApplication sharedApplication]

             presentLocalNotificationNow:callNotification];

        }

    }

    直接粘贴到AppDelegate里面!

    第五步:发送通知消息!

    注意:PHP文件要和合成的pem证书放到一起,当然你自己配置路径也可以!


    圈出来的是要修改的!

    php文件链接:PHP文件

    到此结束!!!

    感谢博主:https://www.laileshuo.com/2019/05/13/ios-通过voip-push实现语音播报/

    感谢网上认识的小伙伴!

    鄙视不安慰我失恋❤️的SB室友们!

    相关文章

      网友评论

          本文标题:iOS --使用Voip实现语音播报功能

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