创建后,APNS设备令牌是否会更改?


99

创建后,推送通知设备令牌是否会更改?

该应用程序何时更新的示例?还是在其他情况下可以更改?


确保您看到此答案,因为它为4个设备令牌更改的地方提供了文档
Honey

Answers:


71

摘自[Apple Documentation ApplePushService] 2

此令牌信任阶段的形式可确保只有APN生成以后会接受的令牌,并且它可以确保自身传递给设备的令牌与之前为该特定设备提供的令牌相同-并且仅该设备。

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


当前文档已删除最后一句。似乎(从另一个SO问题,stackoverflow.com/ questions/ 2751481/…)来看,恢复数据保留APN令牌,但操作系统会安装并且“擦除”会重置它(除非它们随后将数据恢复到新安装的操作系统)。
罗伯特·奥特曼

1
@RobertAltman-我认为这不是全部。我已经从完全不同的设备使用完全相同的 APNS令牌在我们的数据库中看到了许多注册。我现在眼前看到的是iPad 2和向我们发送相同令牌的iPhone 3GS。其他人可以确认这种行为吗?
DougW 2012年

@DougW,这很奇怪。您还有类似的问题吗?编辑了链接,并从最新文档发布。
iosCurator

139

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

为了明确起见,Apple声明“应用程序每次启动时都应向[APN服务器]注册,并向其提供者提供当前令牌”。 我完全同意;这样做可以保护您的应用程序免受错误的假设或异常情况的影响。

推送通知令牌在单个设备的所有应用程序中是否唯一的答案之一指示设备令牌在“操作系统安装”中是唯一的;从备份还原到设备将保留令牌,但擦除设备将导致它获得新令牌。这完全符合Apple的无缝操作和隐私保护的意图:擦拭设备非常严重,也许可以保证建立新的关联,但是在操作系统更新后恢复映像的用户希望保留其现有通知。如果我记得iPad上最近的iOS5更新,则在升级后恢复了最新的备份,因此可以保持通知令牌的一致性。[编辑:将备份还原到其他 设备将不会复制令牌。]

警告:我对这个主题没有明确的知识,只有一些与APN(作为第三方开发人员)合作的合理经验。与往常一样,最好验证您的假设。


更新(2012年6月):

我最近有机会a>与Apple工程师交谈并b>运行一些实际测试,我想介绍一下结果:

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

首先,苹果工程师说,两个设备不可能返回相同的APN。尽管有以下评论,但我无法确定失败的情况。

其次,这是升级测试顺序和结果:

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

  2. 升级到iOS5
    根据先前的测试,我知道APN令牌现在有所不同

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

  4. 重置iOS(干净设备)
    APN令牌更改

  5. 将其他手机备份到iTunes并将该备份恢复到测试设备;基本上,我正在还原“错误的”备份,就像在切换电话一样。
    APN令牌再次更改;此外,它是独特的,并且与原始令牌或“克隆的”令牌都不匹配。

  6. 将“正确的”备份还原到设备。
    现在,APN令牌与步骤1相同。

  7. 最后,我将手机升级到iOS6(beta2),还原了我的备份,然后重新进行了测试。如预期的那样,令牌在步骤1中继续与令牌匹配。

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


更新(2012年8月)

我只是意识到我还没有添加:设备令牌改变。一位苹果开发人员与我分享了令牌确实失效的情况(我认为是2年后)。对于许多目的,这足够长,可以认为是不变的。

[我不担心是否必须每两年使用新令牌更新我的测试脚本,尤其是因为我每年都要更换手机。]


那么这是否意味着您可以使用令牌作为唯一标识用户的方式?(这在必须“投票”的应用中非常实用?)。我可以想象这样的情况:用户投票,应用程序通过通知以随机数响应。该数字必须重新发送到服务器,以使投票有效。这种投票方式不容易操纵。
蟾蜍

也很有趣:在删除应用程序并重新安装时,令牌是否会更改。还是类似于“还原备份”选项
Toad 2012年

@Toad删除并重新安装应用程序后,令牌不会更改。
罗伯特·奥特曼

@Toad我认为这不是一种很好的用户识别形式。由于令牌在每个设备(以及每个应用程序)中都是唯一的,因此拥有多个设备的用户将拥有多个令牌。
罗伯特·奥特曼

1
我想知道证书和设备令牌之间的关系。如果.p12证书过期,则需要更改新证书。我找到了一个参考:“当需要新的设备令牌时,APN将使用设备证书中包含的信息来生成一个。” 因此,更改证书时是否不可能刷新设备令牌?
illusionJJ


22

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

只要您的应用收到令牌,就应该存储它。然后,无论何时收到新令牌(最终都会发生),请将新令牌与存储的令牌进行比较,如果它们不同,则:

  1. 更新设备的本地存储(可能包括nil
  2. 更新使用令牌的设备上的所有内容以了解新令牌
  3. 将知道此令牌的所有API更新为新令牌。

实际上,最后一步很可能是不平凡的。例如,如果您有一项服务正在根据设备已订阅的邮政编码将天气警报发送到设备令牌,则您需要将old_token和传递new_token给所述服务,以便它可以更新交付。

Ergo,通常来说,100%接受“设备令牌”的API也必须具有某种UPDATE用于该令牌的功能。为此构建是针对错误传递和未传递的通知进行构建。


听起来不错,但是我已删除并重新安装了什么应用程序?在那种情况下,我保存在本地存储下的设备令牌将被删除
Kuf 2015年

@Kuf,你得到这个问题的答案了吗?我有同样的想法-即使卸载或重新安装了应用程序,我们将如何比较系统令牌?
nkirkes '16

@nkirkes看到此问题的更多详细信息
Kuf 2016年

您谈论的三个“更新”点是iOS,SDK还是我们自己的责任?
昵称'18

7

设备令牌确实从iOS 8和更高版本更改

请从Apple网站查看以下文字。注册,安排和处理用户通知

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


2
网址已失效!请修复它。
拉米斯(Ramis)


4

我认为值得一提的是,您致电后,没有人更改过令牌unregisterForRemoteNotificationsregisterForRemoteNotifications下次呼叫时,令牌不同。我未能在Apple文档中找到对此的任何确认,但是我亲眼目睹了这种行为。请记住这一点


3

除非您的应用程序恢复到新设备上,否则它不会更改(此时将不再要求它再次接受推送通知,而只是在您应该接受新令牌的时候向您发送已注册的呼叫)。

但是Apple不保证它永远不会改变(因此文档中从未提及它)。您最好针对最坏的情况进行编程,并假设它可能会在一天后发生变化。另外,定期向服务器发送令牌可以使您删除一段时间未注册的令牌,并且可能不久前已经卸载了您的应用程序或失去了兴趣(并且文档确实将其指定为需要的行为!)。


您是正确的:您不能假设令牌是永久的;遵守APN文档中定义的参与规则。实际上,Apple开发人员告诉我,令牌最终会更改(大约2年后)。
罗伯特·奥特曼

1
恢复旧的讨论,但有人可能会发现它有用:我本周花了一些时间在自托管的Parse服务器上工作,并遇到了测试问题-事实证明,每次刷新开发应用程序时(当我制作一个UX更改的次数也是如此),每次安装软件时令牌ID都会改变...那样就不是太有趣了吗?(叹气)
ChrisH

3

来自-Apple Docs

APN可以出于多种原因发行新的设备令牌:

  • 用户在新设备上安装您的应用

  • 用户从备份中还原设备

  • 用户重新安装操作系统

  • 其他系统定义的事件

因此,应用程序必须在启动时请求设备令牌。

另外:

重要

APNs设备令牌的长度是可变的。不要硬编码它们的大小。


2

链接很快就被苹果淘汰了!所以我引用了现在似乎很清楚的东西:

切勿在您的应用程序中缓存设备令牌;而是在需要时从系统中获取它们。当某些事件发生时,APN会向您的应用发布新的设备令牌。例如,当用户从备份中还原设备时,在新设备上安装应用程序时以及用户重新安装操作系统时,设备令牌都可以保证是不同的。获取令牌而不是依赖缓存,可确保您拥有提供者与APN通信所需的当前设备令牌。当您尝试获取设备令牌但未更改时,fetch方法将快速返回。

从本指南


0

作为苹果推送通知的参考

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

永远不要缓存设备令牌;始终在需要时从系统获取令牌。如果您的应用程序先前已注册用于远程通知,则再次调用registerForRemoteNotifications方法不会产生任何额外的开销,iOS会立即将现有设备令牌返回给您的应用程序委托。此外,iOS会在设备令牌更改时随时调用您的委托方法,而不仅仅是响应您的应用程序注册或重新注册。


0

根据此链接,设备令牌

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


0

是的,它可以改变。理想情况下,只要我们通过回调方法收到令牌

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

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

根据Apple文档

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

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


0

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

这意味着,如果您重新安装该应用程序,它将发生变化;如果从备份(iOS升级版本等)进行备份,它不会出现问题。

避免任何问题的正确使用方法是NSPAppDelegate,在方法中的每个应用程序启动时获取给定的方法。didRegisterForRemoteNotificationsWithDeviceToken

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.