Answers:
摘自[Apple Documentation ApplePushService] 2
此令牌信任阶段的形式可确保只有APN生成以后会接受的令牌,并且它可以确保自身传递给设备的令牌与之前为该特定设备提供的令牌相同-并且仅该设备。
如果用户将备份数据还原到新设备或重新安装操作系统,则设备令牌会更改。
在这一点上,苹果的官方文档尚不清楚。我观察到的是:对于给定的设备,应用程序和域(生产与沙箱),令牌是不变的。我相信,为了使系统可靠地运行,必须保持这种情况。考虑一下应用程序更新触发新的APN令牌的情况;如果我使用的是最伟大的类似Twitter的新应用程序,并且启用了通知,那么从iTunes更新我的应用程序时会发生什么?我是否应该期望即使将更新“同步”到我的设备上之后也没有运行应用程序,它仍将继续发送通知?更改应用程序的行为不会影响APN系统,因为即使您尚未运行更新的应用程序,操作系统也可以代表您接收通知。
为了明确起见,Apple声明“应用程序每次启动时都应向[APN服务器]注册,并向其提供者提供当前令牌”。 我完全同意;这样做可以保护您的应用程序免受错误的假设或异常情况的影响。
推送通知令牌在单个设备的所有应用程序中是否唯一的答案之一?指示设备令牌在“操作系统安装”中是唯一的;从备份还原到设备将保留令牌,但擦除设备将导致它获得新令牌。这完全符合Apple的无缝操作和隐私保护的意图:擦拭设备非常严重,也许可以保证建立新的关联,但是在操作系统更新后恢复映像的用户希望保留其现有通知。如果我记得iPad上最近的iOS5更新,则在升级后恢复了最新的备份,因此可以保持通知令牌的一致性。[编辑:将备份还原到其他 设备将不会复制令牌。]
警告:我对这个主题没有明确的知识,只有一些与APN(作为第三方开发人员)合作的合理经验。与往常一样,最好验证您的假设。
我最近有机会a>与Apple工程师交谈并b>运行一些实际测试,我想介绍一下结果:
为了完整起见,当我谈论返回APN令牌时,我假设使用单个捆绑包标识符/应用程序的上下文。
首先,苹果工程师说,两个设备不可能返回相同的APN。尽管有以下评论,但我无法确定失败的情况。
其次,这是升级测试顺序和结果:
从iPhone4上安装的iOS4开始;iTunes中的备份设备
升级到iOS5
根据先前的测试,我知道APN令牌现在有所不同
将备份还原到设备
APN令牌现在与步骤1相同。
重置iOS(干净设备)
APN令牌更改
将其他手机备份到iTunes并将该备份恢复到测试设备;基本上,我正在还原“错误的”备份,就像在切换电话一样。
APN令牌再次更改;此外,它是独特的,并且与原始令牌或“克隆的”令牌都不匹配。
将“正确的”备份还原到设备。
现在,APN令牌与步骤1相同。
最后,我将手机升级到iOS6(beta2),还原了我的备份,然后重新进行了测试。如预期的那样,令牌在步骤1中继续与令牌匹配。
在这一点上,我非常有信心APN令牌不能在不同的设备之间重复。也许这可能是iOS早期版本中的错误,但是我相信iOS5(可能是iOS6)可以正确处理APN令牌。
我只是意识到我还没有添加:设备令牌会改变。一位苹果开发人员与我分享了令牌确实失效的情况(我认为是2年后)。对于许多目的,这足够长,可以认为是不变的。
[我不担心是否必须每两年使用新令牌更新我的测试脚本,尤其是因为我每年都要更换手机。]
如果我重新安装应用程序,我刚刚用iOS9和APN Push令牌更改进行了测试。
是的,设备令牌可以更改。
只要您的应用收到令牌,就应该存储它。然后,无论何时收到新令牌(最终都会发生),请将新令牌与存储的令牌进行比较,如果它们不同,则:
nil
)实际上,最后一步很可能是不平凡的。例如,如果您有一项服务正在根据设备已订阅的邮政编码将天气警报发送到设备令牌,则您需要将old_token
和传递new_token
给所述服务,以便它可以更新交付。
Ergo,通常来说,100%接受“设备令牌”的API也必须具有某种UPDATE
用于该令牌的功能。不为此而构建是针对错误传递和未传递的通知进行构建。
设备令牌确实从iOS 8和更高版本更改
请从Apple网站查看以下文字。注册,安排和处理用户通知
设备令牌是将推送通知发送到特定设备上的应用程序的关键。设备令牌可能会更改,因此您的应用在每次启动时都需要重新注册,并将接收到的令牌传递回服务器。如果您无法更新设备令牌,则远程通知可能不会进入用户的设备。当用户将备份数据还原到新设备或计算机或重新安装操作系统时,设备令牌始终会更改。将数据迁移到新设备或计算机时,用户必须先启动您的应用程序,然后才能将远程通知传递到该设备。
我认为值得一提的是,您致电后,没有人更改过令牌unregisterForRemoteNotifications
。registerForRemoteNotifications
下次呼叫时,令牌不同。我未能在Apple文档中找到对此的任何确认,但是我亲眼目睹了这种行为。请记住这一点
除非您的应用程序恢复到新设备上,否则它不会更改(此时将不再要求它再次接受推送通知,而只是在您应该接受新令牌的时候向您发送已注册的呼叫)。
但是Apple不保证它永远不会改变(因此文档中从未提及它)。您最好针对最坏的情况进行编程,并假设它可能会在一天后发生变化。另外,定期向服务器发送令牌可以使您删除一段时间未注册的令牌,并且可能不久前已经卸载了您的应用程序或失去了兴趣(并且文档确实将其指定为需要的行为!)。
APN可以出于多种原因发行新的设备令牌:
用户在新设备上安装您的应用
用户从备份中还原设备
用户重新安装操作系统
其他系统定义的事件
因此,应用程序必须在启动时请求设备令牌。
另外:
重要
APNs设备令牌的长度是可变的。不要硬编码它们的大小。
作为苹果推送通知的参考
设备令牌是将推送通知发送到特定设备上的应用程序的关键。设备令牌可能会更改,因此您的应用在每次启动时都需要重新注册,并将接收到的令牌传递回服务器。如果您无法更新设备令牌,则远程通知可能不会进入用户的设备。当用户将备份数据还原到新设备或计算机或重新安装操作系统时,设备令牌始终会更改。将数据迁移到新设备或计算机时,用户必须先启动您的应用程序,然后才能将远程通知传递到该设备。
永远不要缓存设备令牌;始终在需要时从系统获取令牌。如果您的应用程序先前已注册用于远程通知,则再次调用registerForRemoteNotifications方法不会产生任何额外的开销,iOS会立即将现有设备令牌返回给您的应用程序委托。此外,iOS会在设备令牌更改时随时调用您的委托方法,而不仅仅是响应您的应用程序注册或重新注册。
根据此链接,设备令牌
每个请求中包含的设备令牌代表接收通知的设备的身份。APN使用设备令牌来标识每个唯一的应用程序和设备组合。它还使用它们来验证发送到设备的远程通知的路由。每次您的应用在设备上运行时,它都会从APN中获取此令牌并将其转发给您的提供商。您的提供商存储令牌并在向该特定应用和设备发送通知时使用它。 令牌本身是不透明且持久的,仅在擦除设备的数据和设置时才会更改。只有APN才能解码和读取设备令牌。
是的,它可以改变。理想情况下,只要我们通过回调方法收到令牌
- (void)应用程序:(UIApplication *)应用程序didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
该应用程序应在远程服务器上注册/刷新令牌。这将确保APNS和您的服务器上的令牌保持同步。
根据Apple文档,
获取和处理特定于应用程序的设备令牌的工作方式如下:
您的应用程序向APN注册以进行远程通知。当需要新的设备令牌时,APN使用设备证书中包含的信息生成一个。它使用令牌密钥对令牌进行加密,然后将其返回到设备,如中间的向右箭头所示。系统通过调用application:didRegisterForRemoteNotificationsWithDeviceToken:委托方法将设备令牌重新发送回您的应用程序。收到令牌后,您的应用程序(在委托方法内)必须将其以二进制或十六进制格式转发给您的提供程序。没有此令牌,您的提供商将无法向设备发送通知。有关详细信息,请参阅配置远程通知支持中的注册接收远程通知。