1 push 基本流程原理
(1)启动 app
(2)注册远程通知
(3)苹果服务器回调一个deviceToken "didRegisterForRemoteNotificationsWithDeviceToken:”
(4)把该deviceToken传递给我们的服务器/第三方push服务接收deviceToken方法
(5)当我们需要给用户推送消息的时候,服务器或者第三方就会给把这个用户的deviceToken和推送必要内容发送给苹果都得APNS服务器.然后APNS服务器再将消息推送到该deviceToken对应的这台手机上面.
2 deviceToken 认识
"If the user restores backup data to a new device or computer, or reinstalls the operating system, the device token changes"
当手机重置刷机生系统,deviceToken会变化 ,开发者生产者证书的切换也会使deviceToken有变化.
对于1的介绍, 也就是说发送远程push 对手机的识别基于deviceToken.来判断的. 那么 deviceToken是唯一的可用来作为主键的吗?
个人认为:辩证看这个问题,deviceToken是会变化的,但是推送一定是拿deviceToken来做推送识别的.也就是说deviceToken是作为设备的唯一标示.
那么,这就是为什么注册远程通知的步骤是在启动app时候,每次都注册远程通知,这样即使deviceToken会变化(说明之前的deviceToken失效无法获得推送),或者之前由于网络等各种原因没有注册上都会重新获得deviceToken.
所以,deviceToken是否变化理应不影响推送.
那么下面两个问题是关键:
3 给同一个用户同一个手机推送推送多条推送 问题
说明 deviceToken变化后,在旧deviceToken还未失效,那么服务端一条一条推送 就推送了多个... 那么当前情况就是应该推送当前用户当前应用一条有效推送,即告诉服务端哪个deviceToken才是有效的.
这里解决方案是 获取当前设备的UUID + keychain + DeviceToken 来处理该问题.
使用keychain能够保证用户当前设备不刷机情况,即使用户删掉应用重新安装仍然还能获取到keychain中的UUID,这样 告诉服务端 当前UUID 有效deviceToken 是哪一个即可
4 给同一用户 多个硬件端 推送问题
如果有这样的用户 用同一个账号登了好几个硬件, 这个时候 是给几个硬件都发推送????还是只发其中一个??? 感觉有点蒙逼…
首先要考虑第一点 3 中提到的问题, 其二 需求是只发一台 还是当前用户所有设备都发.
都发:多台设备 多个UDID 就对应多个deviceToken 就是正常维护每个UDID对应的deviceToken 发送push即可
如果只发一台:那么 服务端 需要纠结判断一下到底该给当前用户 哪个UDID 所维护最新deviceToken 发送 push呢???
这个我们这里遵守规则维护当前时间戳最新的一条deviceToken的设备 发送push.
推荐工具 : PushMeBaby
noodlewerk/NWPusher
除了使用push第三方外 测试 当前证书 当前测试机 调通 push功能 简单暴力 方便 直接
地址:
https://github.com/stefanhafeneger/PushMeBaby
https://github.com/noodlewerk/NWPusher