前言
面对通话的通知需求,对方呼入,响起铃声和震动,提醒用户,对方挂断之后,铃声震动停止,普通的APNS通知,已经不能达到我们想要的效果,所以需要一种可以用通知就唤醒我们APP的技术,然后使用我们自己的代码进行本地通知,控制通知的出现和消失,苹果的解决方案就是VOIP,PushKit推送。
VOIP使用PushKit
PushKit是苹果在iOS8之后推出的新框架,iOS10之后,苹果更是禁止VOIP应用在后台使用socket长链接,PushKit可以说是为了VOIP而生,满足实时性的同时,还能达到省电的效果,搭配苹果自己的CallKit,可以呈现出类似原生电话通话的效果。
PushKit区别与普通APNs的地方是,它不会弹出通知,而是直接唤醒你的APP,进入回调,也就是说,可以在没点击APP启动的情况下,就运行我们自己写的代码,当然,推送证书和注册、回调的方法也和APNs不同,具体操作如下
1.注册推送证书
和注册普通的证书方法相同,我们只要类型选择VoIP Services Certificate注册就好,VoIP的证书只用一个生产环境(Production)的,开发环境(Development)也可以使用,不必纠结。
2.项目配置
和APNs一样,需要在Project-> Capabilities里打开推送开关和设置后台,需要注意的是,我这里使用的是XCode9,Background Modes的设置里没有VoIP的选项,XCode8会有专门的VoIP选项也需要打开
3.代码配置
工程和证书得设置好之后,就是我们代码的编写了:
import PushKit
在AppDelege里倒入PushKit框架
let pushRegistry = PKPushRegistry.init(queue: DispatchQueue.main)
pushRegistry.delegate = self
pushRegistry.desiredPushTypes = [PKPushType.voIP]
在didFinishLaunchingWithOptions使用代码注册,然后我们就要实现这个PKPushRegistryDelegate的回调方法
extension AppDelegate: PKPushRegistryDelegate {
func pushRegistry(_ registry: PKPushRegistry, didUpdate credentials: PKPushCredentials, for type: PKPushType) {
let device = NSData(data: credentials.token)
let deviceId = device.description.replacingOccurrences(of:"<", with:"").replacingOccurrences(of:">", with:"").replacingOccurrences(of:" ", with:"")
print_debug("pushkit设备token:" + deviceId)
}
func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType) {
print_debug("收到pushkit推送!")
print_debug(payload.dictionaryPayload)
}
}
(PS:print_debug是我写的一个只在开发环境打印的函数)
在func pushRegistry(_ registry: PKPushRegistry, didUpdate credentials: PKPushCredentials, for type: PKPushType)
方法里,我们可以拿到PushKit的推送token,然后上传给我们自己的服务器使用;
func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType)
方法是收到推送的回调,我们可以在这里做一个本地通知来通知用户来电,也可以通过PushKit推送挂断信息来消除通知。
当然,我们的代码完全可以不放在回调里做,因为有PushKit推送消息进来的时候,APP已经在后台启动了,就是说我们写在didFinishLaunchingWithOptions里面的代码已经全部执行了,所以我们的APP的正常生命周期已经开始了,这样我们的可操作性就大了很多,(某种意义上,我们可以使用PushKit在用户不知道的情况下唤醒APP,有点作弊的感觉),就写到这里,PushKit的使用就是这么简单。
更新!!!
最近用Xcode9开启新的工程,继续使用PushKit,遇到极其坑爹的问题,因为Xcode9的Background Modes里面取消了勾选voip的选项,结果导致pushkit注册不成功,无法获取到pushkit的token,爬了坑之后才发现这个问题,解决方法是在info.plist文件里手动添加App provides Voice over IP services
欢迎更正错误和交流,回复评论和私信皆可 😊