iOS VOIP实现语音播报、网络电话

iOS VOIP实现语音播报、网络电话,第1张

。。。。。。。

。。。。。。。

  ios voip 推送--->>>案例  

https://www.jianshu.com/p/22ffe3816090  

https://blog.csdn.net/jjblockAndmm/article/details/78879089    

https://www.cnblogs.com/windsSunShine/p/9399515.html  

https://blog.csdn.net/jeffasd/article/details/68060129   java 

https://oopsr.github.io/2016/06/20/voip/   php 

https://www.jianshu.com/p/e759c864c2b8 验证.pem

。。。。。。。

注意⚠️ token 在 ahc 打包出来的是不一样的,切记

。1。。。。。。。。。。。。。。

如何生成.pem 证书 ,适用于PHP 。Java是.p12 证书

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

但是我惊奇的发现,不管是对于生产pem,还是测试pem,这两个网址都可以进行验证

openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert ck.pem

openssl s_client -connect gateway.push.apple.com:2195 -cert apns-ck.pem

验证结果:

。2。。。。。。。。。。

后台使用的接口

开发接口:gateway.sandbox.push.apple.com:2195

发布接口:gateway.push.apple.com:2195

官网提供的是:

开发接口: api.development.push.apple.com:443

发布接口: api.push.apple.com:443

这两个接口都能使用一个是Socket连接的方式,一个是采用Http的方式

。3。。。。。。。。。。。

用终端命令行cd到我们的VoIP文件夹中(有5个证书),输入: php -f 文件名.php

<?php

$deviceToken = 'token'//能通

//ck.pem密码

    $pass ='******'

    //消息内容

    $message ='收到金额0.12元,来自支付宝扫码支付'

    //数字

    $badge =1

    $sound ='default'

    $body =array()

    $body['aps'] =array('alert'=>$message)

    //把数组数据转换为json数据

    $payload = json_encode($body)

    echostrlen($payload),"\r\n"

    $ctx = stream_context_create([

                                 'ssl'=>[

                                 'verify_peer'      =>false,

                                 'verify_peer_name'=>false

                                 // 'cafile'          =>'/path/to/bundle/entrust_2048_ca.cer',

                                 ]

                                 ])

    // $pem = dirname(__FILE__) .'/'.'ck.pem'

    stream_context_set_option($ctx,'ssl','local_cert','ck.pem')

    stream_context_set_option($ctx,'ssl','passphrase', $pass)

    // gateway.push.apple.com:2195 -->>正式环境

    // gateway.sandbox.push.apple.com:2195 -->>开发环境

    $fp = stream_socket_client('tls://gateway.push.apple.com:2195',$err,$errstr,60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx)

    if(!$fp) {

        print "Failed to connect $err $errstr\n"

        return

    }

    else{

print "Connection OK\n

"

    }

    // send message

    $msg = chr(0).pack("n",32).pack('H*', str_replace(' ','', $deviceToken)).pack("n",strlen($payload)).$payload

    print "Sending message :" . $payload . "\n"

    fwrite($fp, $msg)

    fclose($fp)

    /*

     35 Connection OK

     Sending message :{"aps":{"alert":"A test message!"}} 

    */

。补充。。。。。。。。。。。。。。

1、当app要上传App Store时,请在iTunes connect上传页面右下角备注中填写你用到VoIP推送的原因,附加上音视频呼叫用到VoIP推送功能的demo演示链接,演示demo必须提供呼出和呼入功能,demo我一般上传到优酷。

2、经过大量测试,VoIP当应用被杀死(双击划掉)并且黑屏大部分情况都能收到推送,很小的情况会收不到推送消息,经测试可能跟手机电量消耗还有信号强弱有关。 再强调一遍,测试稳定性请在生产环境测试。

3、如果不足和错误的地方,欢迎补充和改正,谢谢。

Guideline 2.5.4 - Performance - Software Requirements

Your app declares support for VoIP in the UIBackgroundModes key in your Info.plist, but it does not include any Voice over IP services.

Next Steps

To resolve this issue, please revise your app to either add VoIP features or remove the "voip" setting from the UIBackgroundModes key.

We recognize that VoIP can provide "keep alive" functionality that is useful for many app features. However, using VoIP in this manner is not the intended purpose of VoIP.

Request a phone call from App Review

At your request, we can arrange for an Apple Representative to call you within the next three to five business days to discuss your App Review issue.

大致的意思是 :

请修改你的应用程序中添加VoIP功能或删除“VoIP”从uibackgroundmodes键设置。

我们认识到,网络可以提供“活下去”的功能,对于许多应用程序的功能是有用的。然而,这种方式是不使用VoIP VoIP的目的。

在plist中Required background modes :App provides Voice over IP services

如果没有用到,直接删除这个字段即可,有用到,就要说明原因了

     相信大家常用的都是apns通知,大部分也是集成极光的SDK进行处理,除了软电话以及即时通讯类的APP大家也很少接触Voip通知。在这里就给大家讲一下,一个小白,从了解到完成Voip的过程。

    首先Voip通知会在收到通知的时候后台唤醒我们要接收通知的APP,但APNS不会,在Voip唤醒APP后我们就可以做出相应的 *** 作。比如震动,声音,以及其他等等 *** 作。

    Voip通知需要大家引入<PushKit/PushKit.h>库,需要在BuildPhase ->Link Binary Witn Libraries 中倒入PushKit以及callKit库,如果没有即时通讯功能引入callKit库容易被拒哦。

    证书在这就不给大家多说了,进入开发者后台,点击证书选项很容易就能找到Voip证书。

给大家看一下实现吧

    1、初始化

    2、三个代理方法

        (1)APP启动时通过此代理方法,获取VoipToken以及推送方式Type

  - ( void )pushRegistry:(PKPushRegistry*)registrydidUpdatePushCredentials:(PKPushCredentials*)pushCredentialsforType:(PKPushType)type

           (2) 收到消息后的代理方法 (收到的通知内容都在 payload 参数内,在这个方法里,大家可以做一些收到通知后的内容)

- ( void )pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(PKPushType)type withCompletionHandler:( void (^)( void ))completion

          (3)过期token的类型

- ( void )pushRegistry:(PKPushRegistry *)registry didInvalidatePushTokenForType:(PKPushType)type

如果童鞋们的服务端没有处理过Voip也无从下手的话,可以把下面这篇文章发给他们看哦。https://www.programmersought.com/article/81816206615/

说一下坑,就是处理VoipToken,因为它是data类型,而服务端要的是string类型,所以要进行转换,找了很多方法,最后的方法是这样的,希望大家不要像我一样再次踩坑。

NSMutableString *str = [NSMutableString string]

    const char *bytes = pushCredentials.token.bytes

    for ( int i =0i <pushCredentials.token.lengthi++) {

        [strappendFormat:@"%02x",bytes[i]&0x000000FF]

    }


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11284631.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存