Apple 推送通知 - 从生产应用程序获取空推送令牌 - 将在修复配置文件问题后发送推送令牌

Posted

技术标签:

【中文标题】Apple 推送通知 - 从生产应用程序获取空推送令牌 - 将在修复配置文件问题后发送推送令牌【英文标题】:Apple push notifications - getting empty push token from production app - will push tokens be sent after fix provisioning profile issue 【发布时间】:2013-03-05 21:41:08 【问题描述】:

我们向 iPhone 应用添加了接收推送通知。一切都在测试/沙盒环境中运行,我们从应用程序获取令牌 ID,并且可以从我们的服务器发送推送通知。

但是现在该应用程序已获得批准并从 Appstore 中出来,我们收到了空的推送令牌/通知 ID 发送到我们的服务器。我们已经有 600 多个...请注意,最终用户确实会弹出窗口以批准在应用程序中接收通知,应用程序只是在批准后向我们的服务器发送空令牌。因此,APNS 服务器可能会分发空令牌。

以下问题向我们表明,这可能是由于我们用于构建应用商店的配置文件中缺少“推送通知”权利: How do I check if an ios distribution provisioning profile has push notifications enabled?

缺少的权利是由于 Apple 的protalg protal 网站中的一个错误,但在以下文章中提到的“在下载新的配置文件之前修改任何现有配置文件”之后 http://developer.apple.com/library/mac/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/ProvisioningDevelopment/ProvisioningDevelopment.html

我们现在在 .mobileprovision 文件中拥有正确的权利:

<key>Entitlements</key>
<dict>
 ..   
 <key>aps-environment</key>
 <string>production</string>
 ..

所以我们正在重建我们的应用并将其添加到商店。然后希望能收到推送通知。

我希望以上内容可能对其他人有所帮助。但是现在要回答我的实际问题:当他们从商店安装下一个更新时,我们是否也会开始为已经下载当前版本的 600 多个用户接收新的推送令牌?还是我们需要在我们的应用程序中添加一些初始代码? registerForRemoteNotifications 方法现在只在应用程序启动时调用。当推送令牌 id 从空 ('') 更改为实际令牌时也会触发它吗?当然,我们不想再等(小)一周等待新的 AppStore 批准,然后才发现推送通知仍然不适用于某些用户。我希望那里的专家可以告诉我们。

注意:我们使用的是在 MonoTouch 中开发的 iPhone 应用,并使用(旧)APNS-Sharp 库从我们的服务器发送通知,但我认为这些细节与此问题无关。

【问题讨论】:

【参考方案1】:

当这 600 多个用户安装下一次更新并再次运行应用程序时,您的应用程序将调用 registerForRemoteNotifications(因为您说您在启动时调用它),并将获得非空设备令牌(当 application:didRegisterForRemoteNotificationsWithDeviceToken: 是称为)。 Apple 在他们的文档中声明,您应该始终在启动时调用此方法,而不是使用设备令牌的缓存副本,因为不能保证设备令牌保持不变。所以你应该没有任何问题。

这是来自 APNS 文档的相关引用:

应用程序应在每次启动时注册并提供 提供当前令牌。它调用 registerForRemoteNotificationTypes: 方法来启动 注册过程。该方法的参数采用 UIRemoteNotificationType(或者,对于 OS X,一个 NSRemoteNotificationType) 位掩码,指定通知的初始类型 应用程序希望接收 - 例如,图标标记和声音, 但不是警报消息。在 iOS 中,用户可以随后修改 在通知首选项中启用通知类型 设置应用程序。在 iOS 和 OS X 中,您都可以检索 通过调用当前启用的通知类型 enabledRemoteNotificationTypes 方法。操作系统不 徽章图标、显示警报消息或播放警报声音(如果有) 这些通知类型未启用,即使它们已指定 在通知负载中。

这也是相关的:

通过请求设备令牌并将其传递给提供者 在您的应用程序启动时,您可以帮助确保提供商 具有设备的当前令牌。如果用户将备份还原到 为其创建备份的设备或计算机以外的设备或计算机 (例如,用户将数据迁移到新设备或计算机),他 或者她必须至少启动一次应用程序才能接收 再次通知。如果用户将备份数据恢复到新设备 或计算机,或重新安装操作系统,设备令牌 变化。此外,切勿缓存设备令牌并将其提供给您的 提供者;始终在需要时从系统获取令牌。 如果您的应用程序之前已注册,请调用 registerForRemoteNotificationTypes:操作系统中的结果 立即将设备令牌传递给委托人,而不会导致 额外的开销。

【讨论】:

感谢@Eran,很好的回答!我自己再次详细检查了我的 iPhone 代码(实际上已经有一段时间了),我想确实应该在从空值更改为正确值时将推送令牌发送给我们。我会等待将您的答案确定为确定性,以防出现真正出色的答案,并且直到我们的应用程序从商店中出来并且可以正常工作。据我了解,这只能完成一次:P. 是的,它有效!无需在应用程序中更改代码。在下一个版本发布后,我们开始从用户那里接收推送令牌。该应用程序在更新后当然会重置/重新启动,因此在启动时调用 RegisterForRemoteNotifications 并使用新的权利,现在 APNS 确实给了我们令牌。

以上是关于Apple 推送通知 - 从生产应用程序获取空推送令牌 - 将在修复配置文件问题后发送推送令牌的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Apple 推送通知中获取 userInfo

Apple 推送通知仅适用于开发,不适用于生产

Amazon SNS Apple 推送通知教程中的错误(空指针异常)

从 Apple 推送通知中解析数据

iOS:生产推送通知,来自 APNS 服务器的无效令牌

iOS推送通知生产证书通用名称问题