iOS开发技术分享iOSiOS开发零散知识

PushKit的使用

2016-12-03  本文已影响7962人  子瑜愚

1、为什么使用PushKit?

iOS10之后,苹果推出了CallKit框架增强VoIP应用的体验,主要表现在3个方面:

那么,如何在锁屏状态下,呼出系统应用的待接听界面?如何在app杀死或者后台的情况下,知道有用户呼入?

在iOS8之后,苹果引入新的框架PushKit,一种新的push方式,有别于普通的APNs,它不会弹出通知,而是悄悄的告诉我们的app有推送过来,让app做出相应的处理。iOS10开始,苹果不在支持VoIP应用的后台socket长连接,需要使用苹果推荐的pushkit,降低app耗电。PushKit可以说是“准实时”的,实际上延迟在1s左右。

2、PushKit的使用

2.1、制作VoIP证书

文末的参考文章1都有介绍,这里不再赘述,与APNS类似。概述一下:VoIP证书的制作入口在certificates。该证书只有生产环境下的,但是开发环境下也可使用。App ID不能使用通配ID必须使用指定APP ID并且生成配置文件中选择Push Notifications服务。

2.2、制作php服务端使用的pem文件

VoIP证书安装完成后,在keychain中将证书和证书密钥分别导出.p12格式。具体制作过程见参考文章1或者stackoverflow

2.3、客户端代码接入

PKPushRegistry *pushRegistry = [[PKPushRegistry alloc] initWithQueue:nil]; 
pushRegistry.delegate = self;
pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];
- (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(NSString *)type {
    NSString * tokenString = [[[[credentials.token description] stringByReplacingOccurrencesOfString: @"<" withString: @""] stringByReplacingOccurrencesOfString: @">" withString: @""] stringByReplacingOccurrencesOfString: @" " withString: @“"];
 }

设备从苹果服务器获取到了VoIP token,这个token与APNs是不一样的。app将收到的token传递给push服务器。(流程和APNs类似,但是接受的代理方法和token都是不一样的)
获取到的token也是64位的,与APNs一样,需要去掉<>和空格。

- (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type {
  // 呼出系统接听界面
  // 或者生成本地推送
 }

参数payload是一个字典,内容自定义。
上面这个回调,在一切正常的情况下, 在手机重启、应用被系统回收、手动kill程序的情况下, 依然能够被触发, 且可以有一段时间(大概10秒左右, 可能有时会比10秒少一点)用来执行自己的代码。

2.4、php服务端推送测试

php的测试代码见参考文章2,这里记录一下几个点:

3、其他


  1. iOS 8 pushkit使用总结(oc版本+java服务器测试)
  2. Example of iOS VoIP Notification / iOS VoIP Notification实例(swift版本+php服务器测试)
  3. 官方文档
  4. iOS 8之前socket长连接
  5. 该博主写了几篇pushkit API解释的文章
上一篇下一篇

猜你喜欢

热点阅读