【问题标题】:Apple Push Notification Service - Multiple device tokens are valid for the same deviceApple Push Notification Service - 多个设备令牌对同一设备有效
【发布时间】:2015-11-23 09:10:10
【问题描述】:

为了让我们向用户发送 iOS 通知,会发生以下流程:用户安装我们的应用程序,向 APNS 注册,然后将注册令牌发送到我们的服务器,以便稍后用于发送通知。

对用户安装我们应用程序的每台设备重复上述过程;我们希望他们在所有设备上都能收到通知。

除此之外,当用户卸载我们的应用并在同一设备上重新安装时,该过程会重复。

每次重复该过程时,我们都会获得一个新的、不同的注册令牌。这一切都很好,但是,我们注意到直到最近卸载我们的应用程序时,设备令牌在重新安装并生成新令牌后仍然有效。我们的理解是,一个设备可以存在一个唯一的令牌。

Apple 的文档似乎也暗示了这一点 (https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html#//apple_ref/doc/uid/TP40008194-CH100-SW12)

此阶段令牌信任的形式确保只有 APNs 生成稍后将兑现的令牌,并且它可以确保设备交给它的令牌与之前为该特定设备提供的令牌相同— 并且仅适用于该设备。

重新安装后生成新令牌并将其发送到我们的后端时,我们有两个指向同一设备的设备令牌,因此我们向该设备发送了多个通知。我们是否误解了文档?如果是这样,处理重新安装场景的典型方法是什么?

谢谢!

【问题讨论】:

  • 您是否更改了捆绑标识符?
  • 我想补充一点,我 100% 确信这正在发生,你是对的。这也发生在我身上。我向 Apple 报告了这个错误,他们关闭了它,说它现在处于测试阶段。
  • 同样的事情发生在我身上。 ios8 上的设备不这样做……但在 ios9 上,每次安装都会获得不同的设备令牌。它还会在每次安装时发出“____ 希望向您发送推送通知”警报,而无需更改日期等。它肯定会成功完成委托回调,我什至可以将推送发送到此设备....它只是更改每次安装。怎么办?
  • 有人能得到合适的解决方案吗?
  • 我只为我的应用商店应用程序(生产应用程序)而不是从试飞下载的应用程序(开发应用程序)面临这个问题......我无法理解为什么会发生这种情况?..这个问题的任何解决方案..

标签: ios iphone apple-push-notifications


【解决方案1】:

我们只是在这里做了一个测试。在我们的 iOS 8.4.1 测试设备上重新安装我们的应用程序后,我们收到了相同的令牌,而在 iOS 9.1 上,我们总是在重新安装后收到一个新令牌。如果 APNS 使旧设备令牌无效,这不会成为问题,但据我所知,它不会。结果是我们向同一设备的用户发送重复的通知。是否需要一些时间才能使旧令牌失效?

我们决定对此进行服务器端修复,并从我们的数据库中删除一个用户的重复令牌。这不是一个好的和永久的解决方案,但对我们来说是一个短期的解决方案,因为我们的用户通常只在一台设备上使用该应用。

【讨论】:

  • 这是一个很好的解决方案,假设您只向系统中的可识别用户颁发 APNS 令牌。如果您支持向匿名应用用户发送 APNS 通知,解决方案是什么?
  • 你怎么知道令牌有效?
  • @CrossleSong 如果 APNS 服务器不拒绝令牌,则假定它是有效的。此外,如果您向两个不同的令牌发送推送并且它们都被同一个应用程序接收,那么很明显该设备有两个有效的令牌。
  • 一种解决方案是每个用户只存储一个令牌,但这意味着您不能发送到多个设备。
【解决方案2】:

是的,我看到一个设备具有相同的应用程序(我的应用程序),它在其短暂的生命周期内发出了不同的 APNS,其中许多仍然能够接收推送通知(来自生产 APNS 服务器)。

简单的解决方法是让我们的后端 APNS 发送服务仅兑现最后收到的 APNS 令牌。这是可行的,假设每个 iOS 设备都有另一个唯一的主键。好吧,既然 UUID 不再可用,那么我们必须依赖 Apple Vendor ID。 Apple Vendor ID 的问题在于值也会随着时间而变化,因此请务必考虑到这一点。

我们目前仅向具有我们唯一成员/用户 ID 的设备发送推送通知。一旦用户登录我们的应用程序,我们的应用程序就会知道这一点。因此,我们可以使用我们的会员/用户 ID,但如果一个会员/用户有多个设备,这意味着如果我们使用最后一个 APNS 令牌值作为获胜者,那么同一个会员不能有多个 iOS 设备接收推送通知(想想 iPad 和 iPhone,现在很常见)。

因此,话虽如此,当高层管理人员想要向没有唯一成员/用户实际登录的设备发送推送通知时,存在跨流的风险。

【讨论】:

  • 我只收到从应用商店下载的应用而不是从试飞中下载的版本的多个通知...我无法找出导致此问题的主要原因...
【解决方案3】:

我们遇到了同样的问题,我们为 1 个设备找到了 2 个有效的设备令牌。 但是,当我们尝试验证“卸载并重新安装会生成一个新的设备令牌,并且之前的设备令牌仍然有效”时,我们得到了相反的结果。 即生成了新的设备令牌,但之前的设备令牌无效。 我在 2016 年 3 月 9 日和 2016 年 3 月 10 日验证了这一点。

不确定 Apple 是否已修复此错误部分

a) 从现在开始卸载并重新安装应用程序时,旧的 deviceToken 将失效。 (没有新问题)

b) 当前有效的设备令牌将继续有效。 (旧问题无法修复,设备仍会收到来自每个有效设备令牌的多条通知)

看起来我们必须使用“identifierForVendor”来区分唯一的设备:如果我们看到 2 个 deviceToken 共享相同的 identifierForVendor,则清理我们的注册表(并仅保留最新的 deviceToken)。

【讨论】:

  • 我注意到这似乎只发生在那些在他们的设备上同时运行开发 + 应用商店版本的人身上。您是否有任何用户投诉,或者这是您只在内部注意到的?
  • 这个想法看起来很有希望,但根据developer.apple.com/documentation/uikit/uidevice/… 所说identifierForVendor“当用户从设备中删除所有该供应商的应用程序并随后重新安装其中一个或多个应用程序时会发生变化”,所以除非你安装了多个应用程序,它不会解决问题
  • vendorIdentifier 也发生了变化,但也许您可以生成自己的 UUID 并将其存储在钥匙串中(在应用程序重新安装后仍然存在)。使用该值作为您的设备 ID。
【解决方案4】:

“每次重复该过程时,我们都会获得一个新的、不同的注册令牌”。

你确定吗? 100%确定?

根据我的经验,如果您卸载该应用程序,然后重新安装它,那么 99.99% 的时间您将获得相同的设备令牌。如果您每次卸载然后重新安装应用程序时都会获得一个新的唯一设备令牌,那么这是我多年来和多个应用程序从未见过的。因此,可能发生了一些奇怪的事情。

在某些情况下会生成新的设备令牌,但这种情况很少见,您确定在卸载/重新安装之间没有做其他事情吗?

附:生产构建和发布构建有不同的设备令牌,从您的观察中消除这个因素 - 即确保您没有做安装 prod 构建,然后卸载它并重新安装 dev 构建之类的事情,反之亦然。即使您这样做,唯一开发令牌的总数仍然只有两个(尽管每个环境只有一个有效)。

【讨论】:

  • 似乎每次卸载并重新安装应用程序时都会获得一个新令牌。我应该提到它是 ios9 beta 设备。可能是 apns 只为这些 beta 设备生成新令牌,而不会使旧设备失效。
  • Apple 将在 2016 年推出大型设备令牌,但 iOS9 将在 2015 年推出。这可能是大型设备令牌的错误或前兆,或者是由于与 iOS 9 对应的 APN 服务的更改.
  • 我 100% 确定这发生在我身上……我可以在每次安装时记录不同的令牌。它还显示询问用户是否允许推送通知的对话框......
  • 您要更改应用程序包 ID 吗?或以任何方式提供配置文件等?
  • 我在 2021 年遇到同样的问题
猜你喜欢
  • 2015-04-18
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多