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