iOS:生产推送通知,来自 APNS 服务器的无效令牌
Posted
技术标签:
【中文标题】iOS:生产推送通知,来自 APNS 服务器的无效令牌【英文标题】:iOS: Production push notifications, Invalid token from APNS server 【发布时间】:2014-03-21 20:13:33 【问题描述】:我的应用程序现已在应用程序商店中提供,因此我已将其下载到我的设备上。推送通知在开发过程中运行良好。我正在使用 JavaPNS 发送通知,并且我已将其切换为指向 Apple 的生产服务器。
但是,我现在从 APNS 服务器收到 Invalid Token 错误。
我已将存档方案设置为“发布”,并且已将发布设置为使用此分发配置文件:
在该配置文件中,您可以看到我已正确设置环境:
但我仍然得到错误。当我查看我的数据库时,我认为应用程序返回给我的设备令牌与开发设备令牌相同,所以这可能是问题所在。但我不知道为什么它会返回,因为该应用程序已正确签名。这是我也用来测试的设备,会不会有问题?关于这里发生的事情还有其他想法吗?
谢谢!
编辑:我没有在我的代码中存储令牌,Eran 的回答表明唯一的其他可能性是我的数据库中的旧令牌,或者应用程序没有被生产配置文件签名。我已经清除了我的数据库,所以我知道它不是前者,至于后者,我不明白这是怎么回事,因为我只有一个分布配置文件,正如我在上面显示的那样,它正确设置了“aps-environment”键。 XCode 甚至不允许我使用开发配置文件提交应用商店,对吗?其他一些可能性:
我与通知一起发送的密钥有问题是否可能导致“无效令牌”?如果是这样,我可以为我现有的配置文件重新生成此密钥吗?
AppID 中是否包含另一个用于推送通知的配置文件?是否有问题会导致无效令牌错误?
【问题讨论】:
***.com/questions/21423625/… 【参考方案1】:我重新下载了推送生产证书并将其从钥匙串导出为 .p12。这似乎解决了这个问题。尽管错误的私钥给了我“无效令牌”错误,但这似乎很奇怪。
【讨论】:
如果p12不匹配token,“invalid token”错误有一定的逻辑。 您知道将升级推送到应用商店是否会使任何推送令牌与应用的先前版本相关联无效? 我没有使用证书,我正在使用 AuthKey 文件仍然出现此错误【参考方案2】:生产设备令牌与开发设备令牌不同,因此如果您将开发令牌发送到生产 APNS 服务器(反之亦然),这就是问题的原因。
当您切换到生产环境时,您可能没有从服务器中删除开发设备令牌。
或者,如果您从生产应用程序中获取开发令牌,那么应用程序会返回本地存储的设备令牌(您可能在开发过程中存储在设备上),而不是要求 Apple 获取新的设备令牌,或者(如果您确实要求 Apple 提供当前令牌并仍然获得开发令牌)您的应用未使用生产配置文件进行签名。
【讨论】:
我确实从数据库中删除了旧令牌,并且我知道它已正确签名,所以它可能正在存储旧令牌。 @JamesHarpe 如果您在应用程序中存储旧令牌,您应该知道它,因为它会在您的应用程序代码中。 啊,我绝对不会那样做的。【参考方案3】:MyApp 是一个 ios 应用程序,它使用从数据库中获取的 APN 令牌 ID 发送和接收 MyApp 到 MyApp 的推送通知,每个 MyApp 在登录时都会保持更新。推送通知由 MyApp 使用 NWPusher 框架 API 发送。
只要项目在开发人员(调试)模式下运行,发送和接收推送通知就可以完美运行。但是,在生产模式下,发送推送通知将不起作用。
我返回并完全重新创建了我的 AppID、SSL 证书、规定等,但无济于事。接下来,我使用 NWPusher MacOS Pusher 应用程序来尝试向 MyApp 发送推送通知。我将 Pusher 配置为使用 MyApp 的 Production SSL 证书发送推送通知(发送到 MyApp 的 Ad Hoc 分发的 tokenID),并在 中收到以下消息Pusher 日志:“通知错误:APN 无效令牌”。
我接下来注意到 Pusher 有一个复选框选项“应该使用沙盒环境”被选中。我取消选中该选项并再次尝试。这次推送通知已发送,然后由目标手机接收,没有任何错误。这让我重新审视了 NWPusher.connect 调用:
斯威夫特:
let pusher:NWPusher? = try? NWPusher.connect(withPKCS12Data: pkcs12! as Data, password:APNS_Certificate_Password,environment:NWEnvironment(rawValue:1)!)
它有一个环境参数 NWEnvironment 枚举,可能值为 0=none、1=sandbox、2=production、3=auto。
将 rawValue:1(开发沙箱)更改为 rawValue:2(生产)修复了问题:生产推送通知现在可以正常工作。
【讨论】:
感谢您在取消选中此选项后使用“复选框选项'应该使用沙盒环境'”的提示,推送可以发送到临时环境。【参考方案4】:xCode 8.0
安装 xCode 8.0 后出现“无效令牌”错误。 问题在这里找到:项目导航器->选择项目(最上面的项目)->在目标菜单中选择项目名称->在顶部菜单中选择功能->查看推送通知部分->单击“修复问题”
【讨论】:
【参考方案5】:找到这个问题的根本原因,是因为私钥错误。要解决此问题,只需使用 .pem 生成 .p12 证书。要使用 .pem 文件创建 p12 文件,请按照以下方法
【讨论】:
你是如何发现 .p12 的私钥不正确【参考方案6】:在https://developer.apple.com/account/ios/identifier/bundle中的 ios App Bundle IDs 菜单下
如果在生产中,请单击您的应用的 ID,如果旧证书已过期,请添加新证书。
确保您的 App Bundle ID com.myapp.mycom
与您的证书名称 com.myapp.mycom
匹配
【讨论】:
以上是关于iOS:生产推送通知,来自 APNS 服务器的无效令牌的主要内容,如果未能解决你的问题,请参考以下文章
如何从 iOS 应用程序确定正在使用哪个苹果推送通知服务器 (APNS)