简介
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远程推送Demo和PHP服务器配置、以及问题的解决方法
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