APNs 通信有 3 个步骤:
- 您的应用注册以在您的 iOS 中的 appDelegate 中接收 APN。这将为您提供一个用于发送通知的 deviceToken。
- 您的应用程序将 deviceToken 发送到您的管理服务器
- 您的管理服务器与 Apple APNs 服务器连接以发送推送通知
在您的情况下,我知道您的问题出在第 1 步,因为您说您的设备 ID 为空,并且该应用程序没有询问您 APNs 权限。因此,更改您的服务器证书或从 gateway.sandbox.push.apple.com 切换到 gateway.push.apple.com 不会有帮助,因为错误发生在之前。
这显然是您的证书有问题。您应该检查您是否已在Apple iOS Provisioning Portal中完成所有必需的步骤:
- 使用您的应用程序的捆绑标识符创建一个AppId 。避免使用通配符,例如 *.
- 为您的应用配置 InAppPurchase 选项(这不是问题,因为用于通信中的第 3 步)
- 为 Distribution创建一个配置文件,它使用1 中使用的 AppId。(我怀疑这可能是你的问题),然后下载它
- 打开 XCode 项目设置并检查您的归档操作是否使用了在 3 中下载的正确配置文件。确保在组织者要求时选择正确的配置文件。(如果上一步没问题,那么这绝对是你的问题,所以仔细检查一下)。
如果您想确保在将二进制文件再次提交到 AppStore 之前使用正确的配置文件生成二进制文件,请执行以下操作:
- 使用 Finder 打开二进制文件(首先,在 Library/Developer/XCode/Archives/... 打开存档,右键单击它并“显示包内容”,导航到 /Products/Applications/youApp,再次显示包内容),
- 查找文件 embedded.mobileprovision 并使用文本编辑器打开它
- 在二进制内容中,您应该能够本地化几个名为“application-identifier”和“aps-environment”的字段。检查它们的值是否正确。
我敢打赌,如果您检查以前存档的应用程序,您会看到不正确的配置文件。这是您的应用不返回 deviceToken 的唯一原因。(除非它接收到但没有正确发送到您的服务器,这是上述通信的第 2 步中的问题)。