一旦创建,APNS设备令牌是否会发生变化?

时间:2011-07-11 15:06:28

标签: objective-c apple-push-notifications

创建后,推送通知设备令牌是否会发生变化?

应用程序更新后,

示例?或者在任何其他情况下它可以改变??

13 个答案:

答案 0 :(得分:136)

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

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

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

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


更新(2012年6月):

我最近有机会参加>与Apple工程师交谈并且b>进行一些现实世界的测试,我想呈现结果:

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

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

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

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

  2. 升级到iOS5
    从之前的测试中,我知道APN令牌现在不同了

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

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

  5. 将其他手机备份到iTunes并将该备份恢复到测试设备;基本上,我正在恢复“错误”备份,好像我正在切换手机 APN令牌再次发生变化;此外,它与原始令牌或“克隆”令牌的令牌不同且不匹配。

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

  7. 最后,我将手机升级到iOS6(beta2),恢复备份,然后重新测试。正如所料,令牌继续与步骤1中的令牌匹配。

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


    更新(2012年8月)

    我刚刚意识到我没有添加这个:设备令牌更改。其中一位Apple开发者与我分享了令牌实际上已经过期(我认为2年后)。出于许多目的,这足够长,可以被认为是不变的。

    [我不担心每两年我是否需要使用新令牌更新我的测试脚本,特别是因为我每年都会更换手机。]

答案 1 :(得分:68)

来自[Apple Documentation ApplePushService] 2

  

此阶段信令的形式确保仅生成APN   它后来会尊重的标记,它可以保证一个   设备传递给它的令牌与之前的令牌相同   为该特定设备配置 - 仅适用于该设备。

     

如果用户将备份数据还原到新设备或重新安装   操作系统,设备令牌发生变化。

答案 2 :(得分:45)

如果我重新安装应用,我刚刚使用iOS9和APN Push令牌更改进行了测试。

答案 3 :(得分:21)

,设备令牌可以更改。

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

  1. 更新设备的本地存储空间(可能包括nil
  2. 更新使用令牌以了解新令牌的设备上的任何内容
  3. 将任何知道此令牌的API更新为新令牌。
  4. 实际上,最后一步最有可能是非平凡的。例如,如果您的服务根据设备订阅的邮政编码向设备令牌发送天气警报,那么您需要将old_tokennew_token传递给所述服务,以便它可以更新交付。

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

答案 4 :(得分:7)

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

请参阅以下Apple网站上的文字。 Registering, Scheduling, and Handling User Notifications

  

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

答案 5 :(得分:3)

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

但Apple并不保证它永远不会改变(因此文档从未提及它)。你最好为最坏的程序编程并假设它可能会改变一天。此外,定期向服务器发送令牌可以让您删除尚未注册一段时间的令牌,并且可能已经卸载了您的应用程序或丢失了一段时间(并且文档确实将此指定为想要的行为!)。

答案 6 :(得分:2)

链接很快就会变成苹果淘汰了!所以我现在引用一些似乎很清楚的内容:

  

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

From this guide

答案 7 :(得分:1)

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

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

  • 用户从备份恢复设备

  • 用户重新安装操作系统

  • 其他系统定义的事件

因此,应用必须在发布时请求设备令牌。

参考 - Apple Docs

  

注意:APN设备令牌的长度可变。不要硬编码   大小

答案 8 :(得分:1)

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

答案 9 :(得分:0)

参考 Apple push notification stuff

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

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

答案 10 :(得分:0)

根据this link设备令牌

  

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

答案 11 :(得分:0)

它可以改变。 理想情况下,我们通过回调方法

收到令牌
  
      
  • (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
  •   

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

根据Apple documentation

  

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

     

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

答案 12 :(得分:0)

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

这意味着如果您重新安装该应用程序,则会更改;如果你从备份,iOS升级ecc ..

做到这一点,它就不会满足

使用它的正确方法,以避免任何问题,是在方法NSPAppDelegate

的每个应用程序启动时获取didRegisterForRemoteNotificationsWithDeviceToken上给出的那个