陈江川

邮箱:jiangchuanc@gmail.com

iOS - VoIP推送<一>

某天,领导叫我:陈工啊,你看看为什么iOS挂起后,怎么接收不到sip请求啊。你看Android都可以(每次听到这句话都有种蛋蛋的忧伤),你赶紧看看怎么解决!

程序挂起后APP能接收到sip请求就有鬼了,但没有这个功能,这个APP就废了。我想到的第一个解决方法:APP进入后台,不让进入挂起状态。这里网上有很多方式,比如播放无声音频文件,不过貌似审核不过。真头大,然后问问朋友做过类似的功能,果不其然,还是有同伴的,而且审核通过了,这把我乐呵的(文章最后我会把Demo贴出来)。但是!语文中最怕的就是但是了,测试耗电情况,有点恐怖,下面是测试结果:

这就尴尬了,没办法,这种方式只能GG了,是的,心凉。
经过长达60秒的痛定思痛,从问题的根源解决,sip通话底层使用的就是VoIP,而Apple提供了一个机制,可以让APP在挂起及退出的情况下,能接收到VoIP的推送。到目前,我还是不太清楚VoIP推送和普通推送的本质区别。它们都能在APP挂起和退出的情况下,能接收到系统级的推送通知显示。如有明白的朋友,请告知!!!

然后就是在网上找相关的资料,结果真是把我给尿了,都是古老的文章啊:

搜索的文章都是表层的东西,无非就是翻译了Apple官方的文档,尴尬,尴尬。
Tips for Developing a VoIP App
Voice Over IP (VoIP) Best Practices
上面两篇官方文档就不翻译了,英语水平有限,自己翻译吧。

正题

1、扯得有点多,说主题了。想要使用VoIP服务,就得先生成证书,《Voice Over IP (VoIP) Best Practices》中有提到,这里就把步骤贴出来:

然后下面的步骤大家都应该知道,最后会生成一个VoIP Services证书

最后把证书下载下来,双击安装,成功后会在“钥匙串访问”中看到:

然后导出p12文件:

2、然后新建一个项目,注意以下事项(Demo在文章最后):


3、代码有了,VoIP证书也有了,然后就是怎么让APP接收到VoIP的推送了,以下都是在终端运行的:

  • 安装houston

    sudo gem install houston
    
  • 运行Demo,记住要真机!
    然后会有个log:device_token is <这里是十六进制数>

  • 把之前导出的p12文件转成pem

    openssl pkcs12 -in cert.p12 -out voip.pem -nodes -clcerts
    然后输入你生成p12时的密码
    
  • 发送VoIP推送
    apn push "<这里是十六进制数>" -c VoIP证书的路径 -m "发送推送的文字内容"

    apn push "<e3595ab8 2f6d62bf 35a260f3 91abd53d 6782e83a aa1d44c5 af5c7ebc 19dd0730>" -c ~/Desktop/voip.pem -m "VoIP Test"
    
  • 这时,手机会接收到VoIP的推送。

到目前为止,只是单纯的可以接收到来自VoIP的推送,但这样并没有解决文章开头提到的问题!
在《Tips for Developing a VoIP App》开头有这么一段话:
Relying on push notifications to enable VoIP functionality means that your app doesn’t have to maintain a persistent network connection to the associated service or configure a socket for VoIP usage. When a VoIP push notification arrives, your app is given time to handle the notification, even if the app is currently terminated.

也就是APP需要使用socket关联VoIP,至于怎么关联,现在还没想到。对,写这文章的时候我还没解决这问题...

ps:目前使用Doubango提供一个参数,使得APP在后台不会挂起,跟代码进去,发现内部还是使用了播放无声音频的方式。所以关于VoIP,年后会进行解决,如果有小伙伴解决了,我想说:请联系我!感激不尽!

文中大部分内容来自:iOS 8 VoIP Notifications
VoIPDemo
APP后台不挂起Demo,感谢欧阳小伙伴提供的思路

« ReactiveCocoa v2.5学习笔记 iOS推送遇到的坑 »