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

111

推送通知设备令牌一旦创建,是否会发生改变?

例如当应用程序更新时?或者在任何其他情况下它都可能发生更改吗?


请确保查看此答案,因为它提供了设备令牌更改的4个文档位置。 - mfaani
13个回答

147

苹果官方文档对此问题没有明确说明。我所观察到的是:对于给定的设备、应用程序和域(生产环境与沙盒环境),令牌(token)是不变的。我相信这必须保持不变,以便系统能够可靠地工作。考虑这样一种情况:如果一个应用程序更新触发了一个新的APN令牌,那么我使用最新的类Twitter应用程序并启用通知时,当我从iTunes更新我的应用程序时会发生什么?我是否应该期望即使我没有运行应用程序,它仍将继续发送通知?更改应用程序的操作不能影响APN系统,因为即使您还没有运行更新后的应用程序,操作系统也可以代表您接收通知。

明确一点,苹果声明“每次启动应用程序都应向APN服务器注册,并提供其提供商当前令牌”。我完全同意;这样做将保护您的应用程序免受不良假设或异常情况的影响。

回答Are push notification tokens unique across all apps for a single device? 中的一个答案指出,设备令牌对于“操作系统安装”是唯一的;恢复到设备上的备份将保留令牌,但清除设备会导致其获得一个新的令牌。这与苹果旨在实现无缝操作和隐私保护的意图完全一致:清除设备足够严重,可能需要一个新的关联,但用户在操作系统更新后恢复图像时希望保留其现有通知。如果我回忆起我iPad上最近的iOS5更新,升级后我恢复了最近的备份,因此这将保持我的通知令牌一致性。[编辑:将备份还原到不同设备上将不会复制令牌。]

注意: 我没有确定的知识,只是作为第三方开发人员使用APN的一些合理经验。始终验证您的假设是最好的。


更新(2012年6月):

我最近有机会与苹果工程师交谈并进行了一些实际测试,现在想展示一下结果:

完整地说,在我谈到返回APN令牌时,我假设单个捆绑标识符/应用程序的上下文。

首先,苹果工程师表示两台设备不应该返回相同的APN,尽管下面有评论,但我无法确定何种情况下会出现这种情况。

其次,以下是升级测试的顺序和结果:

  1. 从安装了iOS4的iPhone4开始;在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月)

我刚刚意识到我没有添加这个:设备令牌将会改变。苹果公司的其中一位开发人员与我分享,令牌实际上会过期(我想是在两年后)。对于许多目的而言,这已足够长,可以被视为不变的。

[如果我需要每两年更新我的测试脚本以获取新的令牌,我并不担心,特别是考虑到我每年都更换手机。]


@RobertAltman 附带问题。作为一名开发人员,我一直在考虑每年更新我的手机,但我刚刚从 iPhone 4 升级到了 iPhone 6 Plus,并且我是在苹果商店直接购买的手机。这让我花费了很多钱。现在苹果将在今年发布下一代 iPhone,我在犹豫是否应该再次投资?cont. - Pavan
@RobertAltman 继续。这里是我的问题:1)您是否购买了从 iPhone 5 到 iPhone 5s 的每个设备增量,尽管变化非常微小,并且您是否会对 iPhone 6s 做同样的事情,假设变化非常微小,是否值得为了这种微小的变化而再次投资? 2)您是直接购买手机还是参加每年一次的手机计划,使您可以每年更换手机?要么是这样,要么您只是负担得起购买每个增量。我尝试坚持每发布两个 iPhone 设备就购买一个的原则。希望您能回答我的 2/3 个问题。 - Pavan
@Paven 我并不会购买每一款手机;通常只有在推出重大的手机版本时才会升级(例如 iPhone 3G、4、5 和 6)。模拟器可能是经济实惠地覆盖“所有”设备的最佳方式,但我真的没有发现有必要在所有物理设备上进行测试。事实上,手机中最大的问题之一是无法将手机还原到旧版 iOS 进行测试——你需要使用模拟器来完成这项任务。续... - Robert Altman
@Paven 以前我都是直接买手机的,但是对于AT&T和Verizon来说,取消合同的费用($350)比离线购买手机的额外成本低($ +400),所以我一直在签约购买手机。 T-Mobile允许您全款购买手机,但可以分期付款。当然,所有这些都可能会发生改变,所以您应该进行研究。尝试使用不同运营商的手机也不错:拥有Verizon使我能够解决出现电话停止报告位置的情况。希望对您有所帮助。 - Robert Altman
1
我想知道证书和设备令牌之间的关系。如果.p12证书过期,则需要更换新证书。我找到了一个参考文献"当需要新的设备令牌时,APNs使用包含在设备证书中的信息生成一个令牌。"那么更改证书时是否有可能刷新设备令牌? - illusionJJ
显示剩余12条评论

75

来自[Apple Documentation ApplePushService]2

令牌信任的这个阶段形式确保只有APNs生成并稍后处理的令牌,并且它可以确信由设备传递给它的令牌是先前为该特定设备提供的令牌,而且仅针对该设备。

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


当前的文档已经删除了最后一句话。从另一个SO问题(https://dev59.com/V03Sa4cB1Zd3GeqPv4m7)中可以看出,恢复数据将保留APN令牌,但是操作系统的安装和“擦除”将重置它(除非在新安装的操作系统上恢复数据)。 - Robert Altman
1
@RobertAltman - 我认为这不是全部的故事。我在我们的数据库中看到了许多来自完全不同设备的注册,它们使用了完全相同的APNS令牌。我现在面前有一台iPad 2和一台iPhone 3GS,它们向我们发送了相同的令牌。还有其他人可以确认这种行为吗? - DougW
@DougW,这很奇怪。您是否仍然遇到类似的问题?我已编辑链接并从最新文档中发布。 - iosCurator
当前的文档确实包含了最后一句话,只是将其移动并重新组织了一下:“设备令牌保证在以下情况下不同,例如当用户从备份中恢复设备、在新设备上安装您的应用程序以及重新安装操作系统时”。文档并非静态的,概念通常保持不变,但语言经常会定期重新组织。 - Allison
@DougW 如果您的数据库中注册的设备令牌在应用程序中被缓存(文档中说不要这样做),那么这是有道理的。设备本身可能会根据某些事件更改其令牌,但如果应用程序使用缓存的令牌而不是从设备获取令牌,则在后续的注册中将继续错误地注册错误/失效的令牌。我怀疑您正在查看的所有设备都是从带有缓存令牌的备份中恢复的。 - Allison

52

我刚刚在iOS9上进行了测试,如果我重新安装一个应用程序,APN推送令牌会更改。


1
我也可以确认这个。 - Muhammad Adnan
1
是的,它正在改变 :( - Nazik
是的,它会改变。 - Ved Rauniyar
应用程序重新安装请记住,苹果有着让推送通知在手机或操作系统升级后继续工作的强烈愿望。考虑一下:当您升级手机操作系统时,您需要重新运行每个发送推送通知的应用程序吗?这显然是不可行的,苹果非常努力地避免将这种负担强加给他们的客户。同样,在升级到新手机时,不需要保留推送通知应用程序列表并重新运行它们以确保您收到通知。 - Robert Altman
应用程序重新安装是我预期令牌会更改的情况之一。没有理由保留现有令牌,而生成新令牌则有许多与安全相关的原因。 - Robert Altman

24

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

每当您的应用程序接收到令牌时,应该将其存储。然后,每当接收到新令牌(最终会发生),请将新令牌与存储的令牌进行比较,并且如果它们不同:

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

实际上,最后一步最有可能是非平凡的。例如,如果您有一个基于订阅设备的邮政编码向设备令牌发送天气警报的服务,则需要将old_tokennew_token传递给该服务,以便它可以更新交付。

因此,一般来说,接受“设备令牌”的 100% 的 API 必须也具有某种 UPDATE 功能,以更新该令牌。 如果没有为此构建,则是构建错误交付和未交付通知。


听起来不错,但如果我卸载并重新安装了我的应用程序呢?在这种情况下,我保存在本地存储中的设备令牌将被删除。 - Kuf
@Kuf,你得到那个问题的答案了吗?我也有同样的问题 - 如果应用程序被卸载/重新安装,我们如何比较系统token? - nkirkes
@nkirkes请参考此问题了解更多细节。 - Kuf
你所提到的三个“更新”点,它们是由iOS、SDK还是我们自己来负责的? - somenickname

8

iOS 8及其后续版本中设备令牌会发生变化

请参考以下来自苹果官网的文本:注册、调度和处理用户通知

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


4
链接已失效!请修复。 - Ramis
1
好的链接 - SomeGuyFortune

6

我认为值得一提的是,当你调用unregisterForRemoteNotifications后,令牌会发生变化。下次调用registerForRemoteNotifications时,令牌将不同。我没有在苹果文档中找到任何确认此行为的信息,但我亲眼目睹了这种情况。请记住这一点。


4
链接在苹果设备上很容易过时!因此,我引用了现在似乎非常清楚的内容:
永远不要在您的应用程序中缓存设备令牌;相反,在需要时从系统获取它们。当某些事件发生时,APNs向您的应用程序发出新的设备令牌。例如,当用户从备份中恢复设备、用户在新设备上安装您的应用程序以及用户重新安装操作系统时,设备令牌保证是不同的。获取令牌而不是依赖缓存,确保您拥有与APNs通信所需的当前设备令牌。当您尝试获取设备令牌但它没有更改时,获取方法会快速返回。
来自这个指南

4

从 - Apple Docs

APNs可能因为各种原因而发出新的设备令牌:

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

  • 用户从备份中恢复设备

  • 用户重新安装操作系统

  • 其他系统定义的事件

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

此外:

重要提示

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


来自最新的文档(2023年)

不要将设备令牌缓存到本地存储中。当用户从备份中恢复设备、在新设备上安装您的应用程序以及重新安装操作系统时,APNs会发放一个新的令牌。每次您请求系统提供令牌时,您都会获得最新的令牌。


这些“其他系统定义事件”是什么? - Awais Fayyaz

3

除非您的应用程序被恢复到新设备上(此时不会再次请求接受推送通知,而是直接发送已注册的调用,此时您应该接受新令牌),否则它不应更改。

但是,苹果不能保证它永远不会更改(因此文档从未提到过)。最好编写最坏情况的程序,并假设它将来可能会更改。此外,定期向您的服务器发送令牌可以使您删除长时间没有注册的令牌,这些令牌可能已经卸载了您的应用程序或失去了兴趣(文档确实指定了这种行为!)。


您说得对:您不能假定令牌是永久的;请按照APN文档中定义的规则进行操作。实际上,苹果开发人员告诉我,令牌最终会发生更改(大约2年后)。 - Robert Altman
1
重新点燃旧话题,但某些人可能会发现它有用:本周我花费了一些时间在一个自托管的Parse服务器上工作,并且遇到了测试问题-事实证明,每次刷新我的开发应用程序(因为我还进行了许多UX更改),令牌ID都会随着每个软件安装而更改...所以这难道不是太有趣了吗?(叹气) - ChrisH

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接