创建后,推送通知设备令牌是否会发生变化?
应用程序更新后,示例?或者在任何其他情况下它可以改变??
答案 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合作的经验(作为第三方开发人员)。与往常一样,最好验证您的假设。
我最近有机会参加>与Apple工程师交谈并且b>进行一些现实世界的测试,我想呈现结果:
为了完成,当我谈到返回一个APN令牌时,我假设一个包标识符/应用程序的上下文。
首先,Apple工程师表示,两台设备不可能返回相同的APN。尽管有以下评论,但我无法确定失败的情况。
其次,这是升级测试序列和结果:
从iPhone4上安装的iOS4开始; iTunes中的备份设备
升级到iOS5
从之前的测试中,我知道APN令牌现在不同了
将备份恢复到设备
APN令牌现在与步骤1相同。
重置iOS(清洁设备)
APN令牌更改
将其他手机备份到iTunes并将该备份恢复到测试设备;基本上,我正在恢复“错误”备份,好像我正在切换手机 APN令牌再次发生变化;此外,它与原始令牌或“克隆”令牌的令牌不同且不匹配。
将“正确”备份恢复到设备 APN令牌现在与步骤1相同。
最后,我将手机升级到iOS6(beta2),恢复备份,然后重新测试。正如所料,令牌继续与步骤1中的令牌匹配。
此时,我非常确信APN令牌不能在不同设备之间复制;也许这可能是早期版本iOS中的一个错误,但我确信iOS5(可能是iOS6)正确处理APN令牌。
我刚刚意识到我没有添加这个:设备令牌将更改。其中一位Apple开发者与我分享了令牌实际上已经过期(我认为2年后)。出于许多目的,这足够长,可以被认为是不变的。
[我不担心每两年我是否需要使用新令牌更新我的测试脚本,特别是因为我每年都会更换手机。]
答案 1 :(得分:68)
来自[Apple Documentation ApplePushService] 2
此阶段信令的形式确保仅生成APN 它后来会尊重的标记,它可以保证一个 设备传递给它的令牌与之前的令牌相同 为该特定设备配置 - 仅适用于该设备。
如果用户将备份数据还原到新设备或重新安装 操作系统,设备令牌发生变化。
答案 2 :(得分:45)
如果我重新安装应用,我刚刚使用iOS9和APN Push令牌更改进行了测试。
答案 3 :(得分:21)
是,设备令牌可以更改。
只要您的应用收到令牌,就应该存储它。然后,每当收到一个新令牌( 最终会发生)时,将新令牌与存储的令牌进行比较,如果它们不同:
nil
)实际上,最后一步最有可能是非平凡的。例如,如果您的服务根据设备订阅的邮政编码向设备令牌发送天气警报,那么您需要将old_token
和new_token
传递给所述服务,以便它可以更新交付。
Ergo,一般来说,100%接受“设备令牌”的API也必须具有该令牌的某种UPDATE
功能。 不为此构建到构建错误传递和未传递的通知。
答案 4 :(得分:7)
设备令牌确实从iOS 8及更高版本更改
请参阅以下Apple网站上的文字。 Registering, Scheduling, and Handling User Notifications
设备令牌是您在特定设备上向应用发送推送通知的关键。设备令牌可以更改,因此您的应用程序需要在每次启动时重新注册,并将收到的令牌传递回您的服务器。如果您无法更新设备令牌,则远程通知可能无法进入用户的设备。当用户将备份数据还原到新设备或计算机或重新安装操作系统时,设备令牌始终会更改。将数据迁移到新设备或计算机时,用户必须启动应用程序一次,然后才能将远程通知传送到该设备。
答案 5 :(得分:3)
它不应该更改,除非您的应用程序已恢复到新设备上(此时不会再要求它接受推送通知,并且只会向您发送已注册的呼叫,此时您应该接受新的令牌)。
但Apple并不保证它永远不会改变(因此文档从未提及它)。你最好为最坏的程序编程并假设它可能会改变一天。此外,定期向服务器发送令牌可以让您删除尚未注册一段时间的令牌,并且可能已经卸载了您的应用程序或丢失了一段时间(并且文档确实将此指定为想要的行为!)。
答案 6 :(得分:2)
链接很快就会变成苹果淘汰了!所以我现在引用一些似乎很清楚的内容:
永远不要在您的应用中缓存设备令牌;相反,当你需要它们时,从系统中获取它们。当某些事件发生时,APN会向您的应用发出新的设备令牌。设备令牌保证不同,例如,当用户从备份还原设备,用户在新设备上安装应用程序以及用户重新安装操作系统时。获取令牌而不是依赖缓存可确保您拥有提供程序与APN通信所需的当前设备令牌。当您尝试获取设备令牌但未更改时,fetch方法会快速返回。
答案 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和您的服务器上的令牌保持同步。
获取和处理特定于应用程序的设备令牌的工作方式如下:
您的应用程序向APN注册以进行远程通知 需要设备令牌,APN使用包含的信息生成一个令牌 在设备的证书中。它使用令牌密钥加密令牌 并将其返回到设备,如中间所示,右指向 箭头。系统将设备令牌传送回您的应用程序 打电话给你 application:didRegisterForRemoteNotificationsWithDeviceToken:delegate 方法。收到令牌后,您的应用程序(在代表内) 方法)必须以二进制或二进制转发给您的提供者 十六进制格式。您的提供商无法向其发送通知 没有此令牌的设备。有关详细信息,请参阅注册接收 配置远程通知支持中的远程通知。
答案 12 :(得分:0)
安装应用程序时的设备令牌中继。
这意味着如果您重新安装该应用程序,则会更改;如果你从备份,iOS升级ecc ..
做到这一点,它就不会满足使用它的正确方法,以避免任何问题,是在方法NSPAppDelegate
didRegisterForRemoteNotificationsWithDeviceToken
上给出的那个