VoIP实现即时通话通知

简介: VoIP实现即时通话通知

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第29天,[点击查看活动详情](juejin.cn/post/712312… "juejin.cn/post/712312…

近日有朋友做即时通讯项目遇到了App被系统干掉后无法提醒的问题,刚开始最先想到推送,但推送只有一次,提示声也比较短,要像微信那样长时间响铃才行,结果找到了VoIP,这里做个集成笔记。

第一步:获取VoIP服务证书

和其他证书类似,不过VoIP证书不区分生产和测试环境,只有一个。


151.png


0获取VoIP证书.png

下载证书voip.cer

第二步:工程配置

打开Push Notifications开关 和 Background Modes开关152.png

2打开推送开关.png

在Info.plist文件中增加如下键值对:153.png


3Info.plist文件中添加VoIP.png

第三步:代码配置

在AppDelegate导入#import

在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 中进行初始化设置。

PKPushRegistry * voipRegistry = [[PKPushRegistry alloc]initWithQueue:dispatch_get_main_queue()];
    voipRegistry.delegate = self;
    voipRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];

接收Token的方法

- (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(NSString *)type{
    NSString *str = [NSString stringWithFormat:@"%@",credentials.token];
    NSString * tokenStr = [[[str stringByReplacingOccurrencesOfString:@"<" withString:@""]
                            stringByReplacingOccurrencesOfString:@">" withString:@""] stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSLog(@"TOKEN = %@",tokenStr);
}

接收消息的方法

- (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type {
    NSDictionary *dic = [payload.dictionaryPayload objectForKey:@"aps"];
    NSLog(@"******************* push Kit %@***********************",dic);
}

第四步:导出证书

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文件一般就是服务器用来推送的。

第五步:修改服务端代码

文件名:pushMe.php

<?php
    // Put your device token here (without spaces):填写App启动时获取的token
    $deviceToken = '9e5ea4c9956e7551cbb2f3de963006609c9d9c21ec09e2b4e07b0b80fda03c20';
    // 导出.p12密钥时填写的密码
    $passphrase = '123456';
    // Put your alert message here: 填写推送内容
    $message = 'MICHOI_M_CLOUDTALK_';
    ////////////////////////////////////////////////////////////////////////////////
    $ctx = stream_context_create();
    stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
    stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
    stream_context_set_option($ctx, 'ssl', 'verify_peer', false);
    // Open a connection to the APNS server 推送环境,分开发环境和生产环境
    // 开发环境地址:gateway.sandbox.push.apple.com:2195
    // 生产环境地址:gateway.push.apple.com:2195
    $fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err,$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
    if (!$fp)
    exit("Failed to connect: $err $errstr" . PHP_EOL);
    echo 'Connected to APNS' . PHP_EOL;
    // Create the payload body
    $body['aps'] = array(
                         'content-available' => '1',
                         'alert' => $message,
                         'sound' => 'voip_call.caf',
                         'badge' => 10,
                         );
    // Encode the payload as JSON
    $payload = json_encode($body);
    // Build the binary notification
    $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
    // Send it to the server
    $result = fwrite($fp, $msg, strlen($msg));
    if (!$result)
    echo 'Message not delivered' . PHP_EOL;
    else
    echo 'Message successfully delivered' . PHP_EOL;
    // Close the connection to the server
    fclose($fp);
?>

第六步:测试推送

cd 到VoIP文件夹中,输入: php pushMe.php 即可大功告成!!155.png


4VoIP文件夹内容.png156.png

5终端显示.png159.png

6iPhone显示.png

相关文章
|
存储 JSON NoSQL
FreeSWITCH呼叫中心中间件-通话质检接口
原理:通过ASR接口(依赖cti_asr接口),识别出实时识别说话内容,然后和关键词匹配执行挂机等动作。支持群集,配置和记录都存储到REDIS。
411 7
|
网络安全 网络架构
在SIP 语音呼叫中出现单通时要怎么解决?
​ 在VoIP的环境中,特别是基于SIP通信的环境中,我们经常会遇到一些非常常见的问题,例如,单通,注册问题,回声,单通等。这些问题事实上都有非常直接的排查方式和解决办法,用户可以按照一定的排查方式,工具非常高效地解决这些问题。但是,因为技术水平参差不齐,网络上的很多技术也不完整。根据一些用户的使用环境和用户经常遇到一些问题,我们来聊一下以下的问题,并且给出了相应的排查方式,用户可以按照这个方法来解决SIP通话中的问题,有关系统问题看博主名一起交流学习 **在SIP 语音呼叫中,一些用户也经常遇到单通的问题**,简单来说,就是双方呼叫时,只能听到一方的语音。单通问题的主要原因来自于以下几
在SIP 语音呼叫中出现单通时要怎么解决?
|
监控 安全 Linux
处理SIP的voip语音环境问题的方法
在VoIP的环境中,特别是基于SIP通信的环境中,我们经常会遇到一些非常常见的问题,例如,单通,30秒就断线,注册问题,回声等。这些问题事实上都有非常直接的排查方式和解决办法,用户可以按照一定的排查方式,工具非常高效地解决这些问题。但是,因为读者技术水平参差不齐,网络上的很多技术也不完整。笔者今天系统归纳了这些问题。根据一些用户的使用环境和用户经常遇到一些问题,我们列举了以下十个在SIP呼叫中经常遇到的问题,并且给出了相应的排查方式,用户可以按照这些方法来解决SIP通话中的这些问题,有关系统问题欢迎喂博主一起交流学习。这十个经典的问题包括: 不能注册或呼叫到SIP服务器端 30秒挂断呼叫的
|
编解码 网络架构
VOIP呼叫流程
1) 用户摘机,模块化语音插卡实时检测用户的摘机动作。 (2) 模块化语音插卡将摘机信号传递给路由器上的VoIP信号处理模块。 (3) 用户听到VoIP的会话应用程序播放的拨号音,然后开始拨号(但应在拨号音超时之前拨号)。 (4) VoIP会话应用程序收集用户拨打的号码。 (5) VoIP会话应用程序在收集号码过程中实时地与已配置的被叫号码模板进行匹配。 (6) 当成功匹配某个已配置的被叫号码模板后,号码将被映射至某语音网关(此语音网关直接连接目的电话或用户小交换机PBX)。 (7) 主叫语音网关通过IP网络利用H.323建议向被叫网关发起语音呼叫,并为每路呼叫建立通道,用以发送和
|
人工智能 数据可视化 算法
IVR在voip电话系统的应用与价值
IVR在voip电话系统的应用与价值
|
安全 搜索推荐 BI
eyebeam电话呼叫软件使用及配置方法
eyebeam电话呼叫软件使用及配置方法
|
消息中间件 存储 API
iOS小技能:队列管理推送通知,解决收款到账并发语音播报问题。
需求:收款到账语音提醒功能 NSE是比Voip更优雅的解决方案,完成迁移后,总体代码量也比Voip方案少了不少。
303 0
iOS小技能:队列管理推送通知,解决收款到账并发语音播报问题。
|
存储 JSON NoSQL
怎样设置呼叫系统的通话质检接口
实时质检 原理:通过ASR接口(依赖cti_asr接口),识别出实时识别说话内容,然后和关键词匹配执行挂机等动作。支持群集,配置和记录都存储到REDIS。 使用实例 <action application="export" data="nolocal:execute_on_answer_qc=cti_qc_session:bleg_group|common_group"/> <action application="set" data="execute_on_answer_qc=cti_qc_session:aleg_group|common_group"/> <action applicat
SIP的voip语音通话后30秒左右挂断呼叫怎么解决
SIP的voip语音通话后30秒左右挂断呼叫怎么解决