推送通知设备令牌一旦创建,是否会发生改变?
例如当应用程序更新时?或者在任何其他情况下它都可能发生更改吗?
推送通知设备令牌一旦创建,是否会发生改变?
例如当应用程序更新时?或者在任何其他情况下它都可能发生更改吗?
苹果官方文档对此问题没有明确说明。我所观察到的是:对于给定的设备、应用程序和域(生产环境与沙盒环境),令牌(token)是不变的。我相信这必须保持不变,以便系统能够可靠地工作。考虑这样一种情况:如果一个应用程序更新触发了一个新的APN令牌,那么我使用最新的类Twitter应用程序并启用通知时,当我从iTunes更新我的应用程序时会发生什么?我是否应该期望即使我没有运行应用程序,它仍将继续发送通知?更改应用程序的操作不能影响APN系统,因为即使您还没有运行更新后的应用程序,操作系统也可以代表您接收通知。
明确一点,苹果声明“每次启动应用程序都应向APN服务器注册,并提供其提供商当前令牌”。我完全同意;这样做将保护您的应用程序免受不良假设或异常情况的影响。
回答Are push notification tokens unique across all apps for a single device? 中的一个答案指出,设备令牌对于“操作系统安装”是唯一的;恢复到设备上的备份将保留令牌,但清除设备会导致其获得一个新的令牌。这与苹果旨在实现无缝操作和隐私保护的意图完全一致:清除设备足够严重,可能需要一个新的关联,但用户在操作系统更新后恢复图像时希望保留其现有通知。如果我回忆起我iPad上最近的iOS5更新,升级后我恢复了最近的备份,因此这将保持我的通知令牌一致性。[编辑:将备份还原到不同设备上将不会复制令牌。]
注意: 我没有确定的知识,只是作为第三方开发人员使用APN的一些合理经验。始终验证您的假设是最好的。
我最近有机会与苹果工程师交谈并进行了一些实际测试,现在想展示一下结果:
完整地说,在我谈到返回APN令牌时,我假设单个捆绑标识符/应用程序的上下文。
首先,苹果工程师表示两台设备不应该返回相同的APN,尽管下面有评论,但我无法确定何种情况下会出现这种情况。
其次,以下是升级测试的顺序和结果:
从安装了iOS4的iPhone4开始;在iTunes中备份设备
升级到iOS5
从之前的测试中,我知道APN令牌现在已经不同了
将备份还原到设备上
APN令牌现在与步骤1相同。
重置iOS(清洁设备)
APN令牌更改
将不同的手机备份到iTunes,并将该备份还原到测试设备中;基本上,我正在恢复“错误”的备份,就像我在更换手机一样。
APN令牌再次更改;此外,它是独特的,并且不与原始令牌或“克隆”令牌匹配。
将“正确”的备份还原到设备中。
APN令牌现在与步骤1相同。
最后,我将手机升级到iOS6(beta2),恢复我的备份并重新测试。如预期的那样,令牌继续与步骤1中的令牌匹配。
目前,我非常有信心确认APN令牌不能在不同设备之间复制。也许在早期版本的iOS中会出现这种情况作为错误,但我确信iOS5(以及可能的iOS6)正在正确处理APN令牌。
我刚刚意识到我没有添加这个:设备令牌将会改变。苹果公司的其中一位开发人员与我分享,令牌实际上会过期(我想是在两年后)。对于许多目的而言,这已足够长,可以被视为不变的。
[如果我需要每两年更新我的测试脚本以获取新的令牌,我并不担心,特别是考虑到我每年都更换手机。]
来自[Apple Documentation ApplePushService]2
令牌信任的这个阶段形式确保只有APNs生成并稍后处理的令牌,并且它可以确信由设备传递给它的令牌是先前为该特定设备提供的令牌,而且仅针对该设备。
如果用户将备份数据恢复到新设备或重新安装操作系统,则设备令牌会更改。
我刚刚在iOS9上进行了测试,如果我重新安装一个应用程序,APN推送令牌会更改。
是的,设备令牌可以更改。
每当您的应用程序接收到令牌时,应该将其存储。然后,每当接收到新令牌(最终会发生),请将新令牌与存储的令牌进行比较,并且如果它们不同:
nil
)实际上,最后一步最有可能是非平凡的。例如,如果您有一个基于订阅设备的邮政编码向设备令牌发送天气警报的服务,则需要将old_token
和new_token
传递给该服务,以便它可以更新交付。
因此,一般来说,接受“设备令牌”的 100% 的 API 必须也具有某种 UPDATE
功能,以更新该令牌。 如果没有为此构建,则是构建错误交付和未交付通知。
iOS 8及其后续版本中设备令牌会发生变化
请参考以下来自苹果官网的文本:注册、调度和处理用户通知
设备令牌是将推送通知发送到特定设备上的关键。设备令牌可能会更改,因此每次启动应用程序时,您的应用程序都需要重新注册并将接收到的令牌传回您的服务器。如果未更新设备令牌,则远程通知可能无法传递到用户的设备。当用户将备份数据恢复到新设备或计算机上,或重新安装操作系统时,设备令牌总是会更改的。在将数据迁移到新设备或计算机时,用户必须先启动您的应用程序,然后才能将远程通知传递到该设备。
我认为值得一提的是,当你调用unregisterForRemoteNotifications
后,令牌会发生变化。下次调用registerForRemoteNotifications
时,令牌将不同。我没有在苹果文档中找到任何确认此行为的信息,但我亲眼目睹了这种情况。请记住这一点。
从 - Apple Docs
APNs可能因为各种原因而发出新的设备令牌:
用户在新设备上安装您的应用程序
用户从备份中恢复设备
用户重新安装操作系统
其他系统定义的事件
因此,应用程序必须在启动时请求设备令牌。
此外:
重要提示
APNs设备令牌的长度是可变的。不要硬编码其大小。
不要将设备令牌缓存到本地存储中。当用户从备份中恢复设备、在新设备上安装您的应用程序以及重新安装操作系统时,APNs会发放一个新的令牌。每次您请求系统提供令牌时,您都会获得最新的令牌。
除非您的应用程序被恢复到新设备上(此时不会再次请求接受推送通知,而是直接发送已注册的调用,此时您应该接受新令牌),否则它不应更改。
但是,苹果不能保证它永远不会更改(因此文档从未提到过)。最好编写最坏情况的程序,并假设它将来可能会更改。此外,定期向您的服务器发送令牌可以使您删除长时间没有注册的令牌,这些令牌可能已经卸载了您的应用程序或失去了兴趣(文档确实指定了这种行为!)。
根据此链接,请求中包含的设备令牌表示接收通知的设备的身份。APNs使用设备令牌来识别每个唯一的应用程序和设备组合。 它还使用它们来验证发送到设备的远程通知的路由。每次您的应用在设备上运行时,它都会从APNs获取此令牌,并将其转发给提供者。您的提供者存储令牌,并在向该特定应用程序和设备发送通知时使用它。令牌本身是不透明和持久的,仅当设备的数据和设置被抹掉时才会更改。 只有APNs可以解码和读取设备令牌。