PushKit总结

简介

Question:pushkit是什么?
Answer:ios8苹果新引入了名为pushkit的框架和一种新的push通知类型,被称作voip push.该push方式旨在提供区别于普通apns push的能力,通过这种push方式可以使app执行制定的代码(在弹出通知给用户之前);而该通知的默认行为和apns通知有所区别,它的默认行为里面是不会弹出通知的。如果需要,可以添加本地通知等
Question: pushkit能帮我们做什么?
Answer:pushkit中的voippush,可以帮助我们提升voip应用的体验,优化voip应用的开发实现,降低voip应用的电量消耗,它需要我们重新规划和设计我们的voip应用,从而得到更好的体验(voip push可以说是准实时的,实侧延时1秒左右);苹果的目的是提供这样一种能力,可以让我们抛弃后台长连接的方案,也就是说应用程序通常不用维持和voip服务器的连接,在呼叫或者收到呼叫时,完成voip服务器的注册;当程序被杀死或者手机重启动时,都可以收到对方的来电,正常开展voip的业务。也就是说,我们当前可以利用它来优化voip的体验,增加接通率;条件成熟时我们就可以完全放弃后台的长连接,走到苹果为我们规划的道路上。
对于pushkit,除了苹果framework官方文档:https://developer.apple.com/library/prerelease/ios/documentation/NetworkingInternet/Reference/PushKit_Framework/index.html#protocols 以外,能够找到的帮助理解pushkit的莫过于wwdc的视频:712_sd_writing_energy_efficient_code_part_2。该视频也可以从苹果官网下载。

pushkit的局限:

在当前,pushkit仅支持ios8;且该功能正处于演进中,稳定性和在不同ios8小版本设备上的表现也可能有差异,在苹果开发者论坛上也有不少人反馈问题;根据经验,在下个大版本(也就是ios9)上可以期待该功能可以稳定下来。

如果需要在ios8之前的设备上支持pushkit功能,那么需要开发者付出很多额外的努力,这里不展开,有兴趣的同学可以到苹果论坛的相关板块去了解,有一些开发者在这方面走的比较远:

在下面的链接中搜索pushkit关键字,可以查找到相关内容:https://devforums.apple.com/community/ios/connected/push

在简单介绍了pushkit和它能做的事并且了解到它的局限以后,还对pushkit感兴趣的童鞋可以往下继续看了(:)为了避免浪费大家的宝贵时间)。

1.跟apns push类似,pushkit的voippush也需要申请证书(apns证书的申请流程参考:https://www.pushwoosh.com/programming-push-notification/ios/ios-configuration-guide/)(网络有问题,图片上传不成功)
2.使用该证书导出并加载到push服务器上,服务器侧无需做改动,仅替换证书相关的东西即可(具体流程和此前apns证书的加载完全类同);服务器和客户端的交互流程也基本类似。

3.客户端实现:

step1:在工程中添加pushkit;

step2:在工程设置里面的backgroundmode里面添加backgroundfetch、remotenotifications的支持,info.plist

UIBackgroundModes

voip

step3:保险起见,建议开发者使用最新版本的xcode和最新的sdk;也建议重新申请一个mobile provision文件用于打包。

step4:类似apns通知的客户端实现流程,voip push客户端相关的流程也类似:注册voip push通知,实现pushkit相关的代理。

贴出主要代码:

在应用启动(appdelegate的didfinishlaunchwithoptions)后或根控制器的初始化等方法内调用如下代码:

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {

 let pushRegistry = PKPushRegistry(queue: DispatchQueue.main)

 pushRegistry.delegate = self

 pushRegistry.desiredPushTypes = [.voIP]

 //providerDelegate = ProviderDelegate(callManager: callManager)

 let current = UNUserNotificationCenter.current()

 current.delegate = self

 current.requestAuthorization(options: [.badge,.sound,.alert,.carPlay]) { (isYse, error) in

 }

 application.registerForRemoteNotifications()

 return true

 }

//获取token成功调用的方法 此处的token一定不能去空格,不需要尖括号,遇到的坑是和以前一样去掉了空格导致App收不到消息

 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:"")

 print("token:" + deviceId)

 }

j接收到服务器发送的通知后,调用App这个方法,在此处可以自动执行代码,因为这个通知是没有提示,所以可以添加本地通知给用户提示。

 func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void) {

//        PushNotificationManager.sharedInstance.normalPushNotification(withTitle: "John Winston Lennon", subTitle: "《Imagine》", body: "You may say that I'm a dreamer, but I'm not the only one", identifier: "1-1", soundName: "tmp.mp3", timeInterval: 1, isrepeat: false)
//        
//        print("didReceiveIncomingPushWith")

//此处 可以做更新或者语言播报、通知等各种操作
 }

使用pushMeBaby后台测试远程推送

https://github.com/search?utf8=✓&q=pushme+baby

测试

编写完代码之后,打包(归档)项目并导出IPA文件,然后安装到测试设备上(可以通过iTunes的安装)。
运行应用程序,我们可以在设备查看器(Xcode>窗口>设备)中查看设备的日志:在左侧选择正确的设备并点击底部的日志部分。进入日志之后可以使用Command+F查找关键字应用程序启动状态或voip令牌。

https://blog.csdn.net/u013263917/article/details/54883273

iOS10.0 Swift 远程推送通知教程

https://www.jianshu.com/p/baa608bad5eb

iOS远程推送DemoPHP服务器配置、以及问题的解决方法

https://blog.csdn.net/lin1109221208/article/details/51719873

推送测试

https://www.jianshu.com/p/fa66eb11521f

iOS 10 消息推送(UserNotifications)秘籍总结(一)

https://blog.csdn.net/a454431208/article/details/52780857

你可能感兴趣的:(PushKit总结)