有没有办法强制更改您的 iOS 推送通知 deviceToken?

Is there a way to force your iOS push notification deviceToken to change?

Apple 文档对于设备的 deviceToken 何时可以更改有点含糊。防御性编码并测试该代码是值得的。

我编写了我的应用程序,以便在启动时注册推送通知并处理 didRegisterForRemoteNotificationsWithDeviceToken 回调。

我的 didRegisterForRemoteNotificationsWithDeviceToken 将最后一个设备令牌保存到用户默认值,如果令牌仍然相同,则继续。如果它根本没有保存的令牌,或者如果令牌不匹配,它会上传新令牌到我们的服务器。

我还有一种机制可以让我用人类可读的名称命名我的测试设备,例如“4s_1”“5s_1”“5s_2”等。我有一个服务器命令行工具,它采用人类可读的设备名称,从中查找设备的 'identifierForVendor',然后使用标识符查找设备令牌。然后它会触发沙箱通知。

似乎删除应用程序并重新安装它会导致 'identifierForVendor' 发生变化,但 deviceToken 不会发生变化,这与我希望在测试中发生的情况正好相反。我想要一些永远不会改变的值来唯一标识测试设备,并改变设备令牌以便我可以测试我的代码。

编辑:自从写这篇文章以来,我已经更改了应用程序以生成它自己的 UUID 并将其保存到钥匙串中,正如 Wain 在他的回答中所建议的那样。

有没有办法强制 Apple 的 APNs 更改设备的令牌,以便我可以测试我的代码(客户端和服务器端)以处理令牌更改的情况?

我不这么认为。

如果你想要一个单一的唯一标识符,那么你应该明确地创建一个并将其存储在钥匙串中,然后你可以存储设备名称和所有其他详细信息,这样你就有了一个单一的事实。

您存储在钥匙串中的任何标识符将一直存在,直到它被明确删除或设备从没有该钥匙串内容的备份中恢复。

我不确定这种方法是否也会重置令牌,但您可以尝试 reset the permission:

Resetting the Push Notifications Permissions Alert on iOS The first time a push-enabled app registers for push notifications, iOS asks the user if they wish to receive notifications for that app. Once the user has responded to this alert it is not presented again unless the device is restored or the app has been uninstalled for at least a day.

If you want to simulate a first-time run of your app, you can leave the app uninstalled for a day. You can achieve the latter without actually waiting a day by following these steps:

Delete your app from the device. Turn the device off completely and turn it back on. Go to Settings > General > Date & Time and set the date ahead a day or more. Turn the device off completely again and turn it back on.

关于设备标识符的更改:您可以在测试设备上安装第二个应用程序(来自同一发行商的空白应用程序)。如果您重新安装实际的应用程序,identifierForVendor 不应更改。

您可以测试更改存储的设备令牌的客户端。

终止设备中的应用程序

  • 下载(xcode 台设备 window)容器。
  • 在 Library/Perferences/app bundle plist 中找到默认值。
  • 编辑 plist 中的条目。
  • 替换容器(xcode 台设备 window)

重要提示:我发现需要重启设备才能使更改生效。

然后在重新启动时,您的旧设备令牌将不正确,并且可以完成任何需要的操作。

我在调试没有 src 代码的临时应用程序时使用了它。但是,如果您有 src 代码,则可能更容易使 deviceTokens 的比较失败。