一旦创build,APNS设备令牌是否改变?

一旦创build,推送通知设备令牌就会改变?

应用程序更新时的示例 ? 或在任何其他情况下,它可以改变?

从Apple文档ApplePushService

令牌信任阶段的forms确保只有APN生成它将在后面兑现的令牌,并且可以确保设备递交给它的令牌与之前为该特定设备预configuration的令牌相同该设备。

如果用户将备份数据恢复到新设备或重新安装操作系统,则设备令牌会更改。

苹果的官方文件在这一点上还不清楚。 我所观察到的是:令牌对给定的设备,应用程序和域(生产与沙箱)是不变的。 我相信这一点必须保持真实,以使系统可靠地工作。 考虑应用程序更新触发新的APN令牌的情况; 如果我使用的是最新的类似Twitter的应用程序,启用了通知function,当我从iTunes更新我的应用程序时会发生什么情况? 我是否应该期望它会继续发送通知,即使我没有运行应用程序,因为我将更新“同步”到我的设备上? 更改应用程序的行为不会影响APN系统,因为操作系统可以代表您接收通知,即使您尚未运行更新的应用程序。

要清楚的是, 苹果声明:“应用程序应该在每次启动时向[注册APN服务器]注册,并为其提供者提供当前令牌”。 我全心全意地同意; 这样做可以保护您的应用程序免受错误的假设或不寻常的情况。

对于单个设备的所有应用程序是推送通知令牌的唯一答案之一? 表示每个“操作系统安装”设备令牌都是唯一的; 并且从备份恢复到设备将维护令牌,但擦除设备将导致它获得新的令牌。 这完全符合苹果公司无缝操作和隐私的意图:擦除设备足够严重,可能需要新的关联,但在操作系统更新后恢复映像的用户将要保留现有的通知。 如果我回想起iPad上的最新iOS5更新,我在升级后恢复了最近的备份,所以这将保持我的通知令牌的一致性。 [编辑:将备份还原到其他设备不会重复该令牌。]

警告:我对这个主题没有确定的知识,只是与APN(作为第三方开发者)合作的一些合理的经验。 一如往常,最好是validation你的假设。


更新(2012年6月):

我最近有机会和苹果的工程师交谈,并进行一些真实世界的testing,我想提出结果:

为了完整,当我谈论返回一个APN令牌时,我假设一个单一的包标识符/应用程序的上下文。

首先,苹果工程师表示,两台设备不可能返回相同的APN。 尽pipe有下面的评论,但我还是无法确定这种情况的失败。

其次,这里是升级testing的顺序和结果:

  1. 从iPhone4上安装iOS4开始; 备份设备在iTunes中

  2. 升级到iOS5
    从以前的testing中,我知道APN令牌现在是不同的

  3. 将备份还原到设备
    APN令牌现在与第1步相同。

  4. 重置iOS(清洁设备)
    APN令牌更改

  5. 将不同的手机备份到iTunes,并将该备份恢复到testing设备; 基本上,我正在恢复“错误”的备份,就好像我正在切换手机一样。
    APN令牌再次改变; 进一步它是不同的,不符合令牌或者原始的标记或者“克隆的”标记。

  6. 将“正确的”备份恢复到设备。
    APN令牌现在与第1步相同。

  7. 最后,我把手机升级到了iOS6(beta2),恢复了我的备份,并重新testing。 如预期的那样,令牌在步骤1中继续与令牌匹配。

在这一点上,我非常确信APN令牌不能在不同设备之间复制; 也许这可能是iOS早期版本中的一个错误,但是我相信iOS5(推测是iOS6)正在正确处理APN令牌。


更新(2012年8月)

我刚刚意识到我没有添加这个:设备令牌将会改变。 其中一位苹果开发人员与我分享,令牌确实到期(2年后,我认为)。 对于很多目的来说,这足够长,可以被认为是不变的。

[我并不担心是否每两年更新一次新令牌的testing脚本,特别是每年更换手机时。

我刚刚testing了iOS9和设备令牌更改,如果我重新安装一个应用程序。

是的 ,设备令牌可以改变。

任何时候,你的应用程序收到一个令牌,它应该存储它。 然后,无论何时接收到新的令牌(最终发生这种情况),将新令牌与存储的令牌进行比较,如果不同:

  1. 更新设备的本地存储(可能包括nil
  2. 更新使用该标记的设备上的任何内容以了解新标记
  3. 更新任何知道这个令牌的API到新的令牌。

作为一个实际问题,最后一步最有可能是不平凡的。 例如,如果您的服务正在根据设备订阅了哪些邮政编码向设备令牌发送天气警报,则需要将old_tokennew_token给所述服务,以便更新交付。

一般来说,接受“设备令牌”的API的100%必须也具有该令牌的某种UPDATEfunction。 为此构build的是构build错误传递和未传递的通知。

它不应该改变,除非你的应用程序被恢复到一个新的设备(在这一点上,它不会被要求再次接受推送通知,只会发送注册的电话,你应该接受新的令牌)。

但是苹果公​​司并不保证它永远不会改变(因此文档从来没有提到它)。 你最好编程最糟糕的,并假设有一天可能会改变。 此外,定期向您的服务器发送令牌使您能够删除尚未注册一段时间的令牌,并且很可能已经卸载了您的应用程序,或者前段时间已经失去兴趣(并且文档将此指定为想要的行为!)。

设备令牌从iOS 8及更高版本变化

请从苹果网站下面的文本。 注册,调度和处理用户通知

设备令牌是将推送通知发送到特定设备上的应用程序的关键。 设备令牌可以改变,所以你的应用程序每次启动时都需要重新注册,并将收到的令牌传回给服务器。 如果您无法更新设备令牌,则远程通知可能无法前往用户的设备。 当用户将备份数据恢复到新设备或计算机或重新安装操作系统时,设备令牌始终会更改。 将数据迁移到新设备或计算机时,用户必须先启动应用程序,然后才能将远程通知传送到该设备。

作为参考苹果推送通知的东西

设备令牌是将推送通知发送到特定设备上的应用程序的关键。 设备令牌可以改变,所以你的应用程序每次启动时都需要重新注册,并将收到的令牌传回给服务器。 如果您无法更新设备令牌,则远程通知可能无法前往用户的设备。 当用户将备份数据恢复到新设备或计算机或重新安装操作系统时,设备令牌始终会更改。 将数据迁移到新设备或计算机时,用户必须先启动应用程序,然后才能将远程通知传送到该设备。

切勿caching设备令牌; 每当需要时总是从系统获取令牌。 如果您的应用程序先前注册了远程通知,再次调用registerForRemoteNotifications方法不会产生额外开销,并且iOS会立即将现有设备令牌返回给您的应用程序委托。 此外,每当设备标记更改时,iOS都会调用您的委托方法,而不仅仅是响应您的应用程序注册或重新注册。

根据这个链接设备令牌

包含在每个请求中的设备令牌表示接收通知的设备的身份。 APN使用设备令牌来识别每个独特的应用和设备组合。 它还使用它们来validation发送到设备的远程通知的路由。 您的应用每次在设备上运行时,都会从APN中获取此令牌并将其转发给您的提供商。 您的提供商存储令牌,并在向该特定应用和设备发送通知时使用该令牌。 令牌本身是不透明和持久的,只有当设备的数据和设置被擦除时才会改变。 只有APN可以解码和读取设备令牌。

是的,它可以改变。 理想情况下,当我们通过callback方法收到令牌时

  • (void)应用程序:(UIApplication *)应用程序didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

应用程序应该在远程服务器上注册/刷新令牌。 这将确保APNS上的令牌和您的服务器保持同步。

按照苹果文档 ,

获取和处理特定于应用程序的设备令牌的工作方式如下:

您的应用程序向APN注册以进行远程通知当需要新的设备令牌时,APN使用设备证书中包含的信息生成一个令牌。 它使用令牌密钥encryption令牌,并将其返回给设备,如中间的右箭头所示。 系统通过调用您的应用程序:didRegisterForRemoteNotificationsWithDeviceToken:delegate方法将设备令牌传回您的应用程序。 收到令牌后,您的应用(在委托方法中)必须以二进制或hex格式将其转发给您的提供者。 没有此令牌,您的提供者不能发送通知给设备。 有关详细信息,请参阅在configuration远程通知支持中注册以接收远程通知。

链接很快就被苹果废弃了! 所以我现在引用的话似乎很清楚:

切勿在您的应用中caching设备令牌; 相反,当你需要的时候,从系统中获取它们。 当某些事件发生时,APN向您的应用发布新的设备令牌。 例如,当用户从备份恢复设备,用户在新设备上安装应用程序以及用户重新安装操作系统时,设备令牌会有所不同。 获取令牌而不是依赖caching,可确保您拥有供应商与APN进行通信所需的当前设备令牌。 当您尝试获取设备令牌但没有更改时,获取方法会很快返回。

从这个指南

设备令牌中继在应用程序的安装。

这意味着如果你重新安装应用程序,它会改变 ; 它不会metter,如果你从备份,iOS升级ecc ..

为了避免任何问题,使用它的正确方法是在每个应用程序启动时获取NSPAppDelegate上给出的方法,方法是didRegisterForRemoteNotificationsWithDeviceToken