苹果推送通知 – 从生产应用程序获取空推送令牌 – 将推动令牌在修复configuration文件问题后发送

我们添加了接收推送通知到iPhone应用程序。 一切都在testing/沙箱环境中工作,我们从应用程序获取令牌ID,并可以从我们的服务器发送推送通知。

但现在,应用程序被批准,并从Appstore出来,我们得到空推令牌/通知ID的发送到我们的服务器。 我们已经有超过600个…请注意,最终用户确实得到popup来批准在应用程序接收通知,应用程序只是发送空的令牌后,我们的服务器批准。 所以APNS服务器可能会发放空令牌。

以下问题向我们表明,这可能是由于在我们用于构buildapp store的configurationconfiguration文件中缺less“推送通知”权限: 如何检查iOS分发configurationconfiguration文件是否启用了推送通知?

缺less的权利是由于苹果公司prg protal网站中的一个错误,但是在下载新文件之前“修改任何现有的configuration文件”之后,就像下面的文章中提到的: 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> .. 

所以我们正在重build我们的应用程序并将其添加到商店。 并希望得到推送通知。

我希望以上可能会帮助其他人。 但是,现在来看看我的实际问题:我们是否会开始接收新的推送令牌,对于已经下载了当前版本的600多个用户,在他们安装下一次更新的时候呢? 或者我们需要添加一些初始代码到我们的应用程序? registerForRemoteNotifications方法现在只在应用程序启动时调用。 当推送令牌id从空('')变为实际令牌时,它也会被触发吗? 当然,我们不希望等待新的AppStore审批的另一个(小)一周,然后才发现推送通知仍然不适用于某些用户。 我希望有一些专家可以告诉我们。

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

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

以下是APNS文档中的相关引用:

应用程序应该在每次启动时注册,并为其提供者提供当前令牌。 它调用registerForRemoteNotificationTypes:方法来启动注册过程。 此方法的参数采用UIRemoteNotificationType(或者,对于OS X,NSRemoteNotificationType)位掩码,该掩码指定应用程序希望接收的通知的初始types,例如图标标记和声音,但不包含警报消息。 在iOS中,用户可以在“设置”应用程序的“通知”首选项中修改已启用的通知types。 在iOS和OS X中,都可以通过调用enabledRemoteNotificationTypes方法来检索当前启用的通知types。 如果任何这些通知types未启用,操作系统不会标记图标,显示警报消息或播放警报声音,即使通知有效内容中指定了这些通知types。

这也是相关的:

每次启动应用程序时,通过请求设备令牌并将其传递给提供者,可以帮助确保提供者拥有设备的当前令牌。 如果用户将备份恢复到除创build备份以外的设备或计算机(例如,用户将数据迁移到新设备或计算机),则必须至less启动一次该应用程序再次收到通知。 如果用户将备份数据恢复到新设备或计算机,或者重新安装操作系统,则设备令牌将发生更改。 此外,永远不要caching设备令牌并将其提供给您的提供商; 每当需要时总是从系统获取令牌。 如果您的应用程序先前已注册,则调用registerForRemoteNotificationTypes:将导致操作系统立即将设备令牌传递给委托,而不会产生额外开销。