77

我在 iTunes 商店中有两个应用程序 - 都实现了推送通知。当我在测试向这些生产应用程序发送通知时,我注意到一个针对应用程序 A 的推送被命名为并打开了应用程序 B。

这两个应用程序都安装在同一部手机上。我查看了我的设备表,发现为这两个应用程序列出的设备令牌(当然还有设备 ID)都是相同的。

根据需要,我在服务器上使用了两个不同的证书 - 每个应用程序一个。我有点假设设备令牌或证书会将消息路由到正确的应用程序,但显然不是。

我可以在 NSLog 中看到,从每个应用程序发送的令牌确实是相同的。

设备令牌是否应该对每个应用程序都是唯一的?如果是这样,知道我的测试手机如何将两个应用程序的相同设备令牌发送到我的服务器。请记住,这是来自应用商店当前的两个应用。

谢谢你的帮助!

4

6 回答 6

92

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

弄清楚了。设备令牌不是电话-应用配对所独有的。它们是手机独有的。如果您在同一部手机上有多个推送应用程序,它们都将使用相同的设备令牌。您用于发送通知的证书将决定它发送到哪个应用程序。

于 2010-02-26T01:01:18.930 回答
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 上,Apple 更进一步,确保设备令牌现在在每个应用程序安装中都不同。这有助于通过删除另一个电话级别的标识符来进一步保护用户的隐私。”

另请参阅 ios 7 设备令牌对于同一设备是不同的

于 2013-11-21T03:02:51.040 回答
16

Sharing my understanding and few answers from Apple Developers:

  • Device Token
    • Device token is the unique identifier of the device.
    • APNs generates device token using the unique device certificate (may be using provisioning profile)
    • Device token may be changed. So make sure you send the updated device token to your server each time.
    • Device token is SAME for all apps on the device.
    • It is device-specific and not app-specific.
    • Device Token may be different for sandbox and production.
      • Based on provisioning profile(sandbox or production), APNs may generate different device token for sandbox and production for the same device.
    • Then, how the push notification is differentiated on device? For which app it is?
      • It does it based on the app identifier and SSL certificate installed on server (using which the notification is pushed to APNs server).
  • References
于 2013-12-11T13:12:42.987 回答
8

也就是说,请记住,Apple 保留在他们认为合适的情况下更改设备 APNToken 的权利,因此不要使用它来唯一标识设备/用户。

于 2011-11-02T04:29:06.923 回答
1

推送通知的设备令牌是特定于应用程序的。不是设备特定的。即设备令牌对于同一设备中的多个应用程序将是不同且唯一的。

据苹果称,

通过支持远程通知,您可以向应用程序的用户提供最新信息,即使应用程序未运行也是如此。为了能够接收和处理远程通知,您的应用必须:

  • 启用远程通知。

  • 注册 Apple 推送通知服务 (APN) 并接收特定于应用程序的设备令牌。

  • 将设备令牌发送到您的通知提供商服务器。

  • 实现对处理传入远程通知的支持。

特定于应用程序的设备令牌是全球唯一的,并标识一个应用程序设备组合。在您的应用中从 APN 接收到设备令牌后,您有责任打开与您的提供商的网络连接。在您的应用程序中,您也有责任将设备令牌连同您想要发送给提供商的任何其他相关数据一起转发。当提供者稍后向 APNs 发送远程通知请求时,它必须包含设备令牌以及通知负载。有关这方面的更多信息,请参阅 APNs 概述。

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

您可以在此处参考苹果文档本地和远程通知编程指南

于 2017-07-27T11:51:11.020 回答
0

您不能使用令牌作为唯一标识符,而是使用 keygen 中的保存删除旧令牌(来自 iTunes 的帮助)并删除旧令牌并在数据库中添加新令牌。

于 2015-12-24T12:35:21.677 回答