APN设备令牌对于每个应用程序是唯一的吗?

77
我在iTunes商店上有两个应用程序 - 都实现了推送通知。在测试向这些生产应用发送通知时,我注意到一个针对应用程序A的推送标题和打开了应用程序B。
这两个应用都安装在同一手机上。我查看了我的设备表,发现两个应用程序的设备令牌(以及当然,设备ID)列出的是相同的。
按要求,我在服务器上使用了两个不同的证书 - 每个应用程序一个证书。我有点想当然地认为设备令牌或证书会将消息路由到正确的应用程序,但显然它并没有这样做。
我可以在NSLog中看到从每个应用程序发送的令牌确实是相同的。
设备令牌是否应该对每个应用程序都是唯一的?如果是这样,请问我的测试电话如何向我的服务器发送相同的设备令牌,其中包括两个当前位于应用商店中的应用程序。
感谢任何帮助!
6个回答

92

注意:这是一个旧答案,仅适用于iOS <= 6。请参考user1641761的答案获取当前方法。

已经弄清楚了。设备令牌并不是唯一的手机-应用程序配对标识,而是唯一的手机标识。如果您在同一手机上有多个启用推送功能的应用程序,则它们都将使用相同的设备令牌。您用来发送通知的证书将决定将通知发送到哪个应用程序。


1
谢谢你的问题和答案,这很有用。每个+1。手机使用服务器证书决定目标应用程序,作为开发者意图的认证,这是有道理的。 - user23743
3
嗨@Mups。在开头的问题中,您声明:“按要求,在服务器上使用两个不同的证书-每个应用程序一个”。然后,在您的回答中,您说:“您用于发送通知的证书将决定它发送到哪个应用程序”....那么,为什么它没有起作用?我即将为我的后端实施类似的设置,我想确保它能正常工作。谢谢。 - tompave
2
另外,请注意设备令牌根据您的构建类型而异。开发构建具有一个设备令牌,分发(生产)构建具有另一个设备令牌。当用户重新安装操作系统时,设备令牌也会被重置为其他值。 - radesix
7
这是一个旧答案,对于旧版iOS(即iOS 6及以下版本)是正确的。自从iOS 7推出后,苹果公司已经改变了规则,设备令牌不再是设备的唯一标识。同一设备上的所有应用程序将具有不同的令牌,与iOS 6及以下版本不同。 - Kameshwar Sheoran
2
将此内容投票否决,因为它已经过时了。请参考user1641761的回答。 - Daniel
显示剩余4条评论

53

iOS 7 现在处理方式已经不同了,它是独一无二的。

请参见这篇文章中的第1点:http://urbanairship.com/blog/2013/10/03/how-ios-7-handles-push-differently

“在 iOS 7 之前,在给定设备上所有应用程序安装中,设备令牌是相同的。您手机上的不同应用程序,例如 Tap Tap Revenge 或 USA Today,将利用相同的地址(即设备标记)将推送通知路由到您。与消息配对的安全凭据将确保它到达正确的应用程序。在 iOS 7 上,苹果进一步采取措施,确保设备标记现在在每个单独的应用程序安装中都是不同的。这有助于通过删除另一个基于手机级别的标识符来进一步保护用户的隐私。”

另请参见iOS 7 设备令牌对于同一设备不同


17

分享我对设备标识和苹果开发者的理解:

  • 设备标识
    • 设备标识是设备的唯一标识符。
    • APNs使用唯一设备证书(可能使用预配配置文件)生成设备标识。
    • 设备标识可能会更改,因此请确保每次向服务器发送更新后的设备标识。
    • 设备标识对于设备上的所有应用程序而言是相同的。
    • 它是设备特定的,而不是应用程序特定的。
    • 沙盒和生产环境下的设备标识可能不同。
      • 基于预配配置文件(沙盒或生产环境),APNs为相同设备在沙盒和生产环境下生成不同的设备标识。
    • 那么,如何在设备上区分推送通知?推送通知是为哪个应用程序而发送的?
      • 它是基于应用程序标识符和安装在服务器上的SSL证书来区分(使用这些推送通知被推送到APNs服务器)。
  • 参考资料

1
错误或过时的答案。根据苹果文档,您的答案不再有效。请参考此处的文档:https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/HandlingRemoteNotifications.html - Augustine P A
设备令牌对于设备上的所有应用程序都是相同的。就像 - 在成功注册后,APNs会向设备发送特定于应用程序的设备令牌。 - Nico

8

需要注意的是,苹果公司保留更改设备APNToken的权利,因此不要将其用于唯一标识设备/用户。


1
设备推送通知的令牌是应用程序特定的,而不是设备特定的。即同一设备上多个应用程序的设备令牌将是不同和独特的。
根据苹果公司的说法,
通过支持远程通知,即使应用程序未运行,您也可以向应用程序用户提供最新信息。要能够接收和处理远程通知,您的应用程序必须:
启用远程通知。
向苹果推送通知服务(APNs)注册并接收特定于应用程序的设备令牌。
将设备令牌发送到您的通知提供程序服务器。
实现处理传入远程通知的支持。
应用程序特定的设备令牌是全局唯一的,并标识一个应用程序-设备组合。在您的应用程序中从APNs接收设备令牌后,您有责任打开到您的提供程序的网络连接。还要在您的应用程序中将设备令牌连同要发送到提供程序的任何其他相关数据一起转发。当提供程序稍后向APNs发送远程通知请求时,它必须包括设备令牌以及通知有效负载。有关更多信息,请参阅APNs概述。
永远不要在应用程序中缓存设备令牌;相反,在需要时从系统获取它们。当某些事件发生时,APNs会向您的应用程序发出新的设备令牌。例如,当用户从备份中恢复设备、在新设备上安装您的应用程序以及重新安装操作系统时,设备令牌保证是不同的。获取令牌而不是依赖缓存,确保您拥有所需的当前设备令牌,以便您的提供程序与APNs通信。当您尝试获取设备令牌但它没有更改时,获取方法会快速返回。
你可以在这里参考苹果文档 本地和远程通知编程指南

0

您不能将令牌用作唯一标识符,但可以使用 Keygen(从 iTunes 获取帮助)中的“保存”功能删除旧令牌,并在数据库中删除旧令牌并添加新令牌。


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