根据这篇文章,现在应该可以使用在 iOS 模拟器中运行的应用程序来测试远程推送通知。但当我们尝试时,我们总是收到状态 400 和
BadDeviceToken
作为错误。
我们已经检查过的内容
api.sandbox.push.apple.com
尽管如此,请求总是返回状态 400 和错误“BadDeviceToken”。
我们还在物理 iOS 设备上尝试了相同的代码。一切顺利,设备收到远程通知。
我们还尝试将相同的请求发送到高效的 APNS 端点。相同的结果,即 Stauts 400,“BadDeviceToken”
在苹果论坛我找到了两个原因,针对这个具体的回应
但是由于我们的应用程序似乎在物理设备上生成工作令牌,并且我们尝试在这两种环境下发送,所以我现在不知道还能尝试什么。此外,模拟器中的令牌看起来与物理设备的令牌没有显着不同(即,它也是相同长度的十六进制字符串)。
我是否错过了一些用于发送到模拟器或在模拟器中生成设备令牌的特殊配置/设置?非常感谢任何帮助。
在这里回答我自己的问题,如果有人偶然发现同样的问题:
我们没有足够彻底地阅读 XCode 发行说明,错过了这一段
设备注册令牌的长度可变。模拟器中的令牌可能大于当前物理设备令牌。不要对这些标记硬编码任何特定的长度或格式。
当然,最后一句话是我们的应用程序中发生的事情,即我们只获取了令牌的固定部分(代码可能取自this或stackoverflow上的类似答案)
这对于物理设备来说似乎工作得很好,因为物理设备的 devicetoken 似乎仍然是 32 字节。但对于模拟器来说,它明显更长(我们看到的令牌有 80 个字节),因此设备令牌的主要部分丢失了,使其无效......