提供具有适当权利的配置文件可防止推送通知注册

Provisioning Profile with Proper Entitlements Prevents Push Notifications Registration

概览

我们目前有两个应用程序,它们的区别仅在于它们的配置文件。应用程序一使用其自己的配置文件正常工作。应用程序二是应用程序一的副本,也有自己的应用程序 ID 和配置文件,具有完全相同的权利。唯一的区别是应用程序二不会注册通知。

为了让事情更有趣,如果我们获取应用程序一的配置文件并将应用程序二配置为使用它们,那么应用程序二将成功注册推送通知。将应用程序二切换回其自己的配置文件并停止注册。

有问题

应用程序 2 将触发 registerForRemoteNotifications 方法,该方法随后应调用 application:didFailToRegisterForRemoteNotificationsWithError:application:didRegisterForRemoteNotificationsWithDeviceToken:,但均未调用。

切换应用二使用应用一的配置文件时,调用application:didRegisterForRemoteNotificationsWithDeviceToken:方法,phone注册成功。

测试与调试

1. 经过一番研究,我了解到这可能是测试设备的问题,而 iPhone 6 Plus 在这种情况下可能不会能够联系 APNS(Apple 推送通知服务)。好吧,在这种情况下,这不是问题,因为在切换配置文件时,同一测试设备可以成功注册。其他测试 iPhone 也无法注册。

2. 我已经多次重新创建配置文件。我还尝试了各种组合,让 xCode 自动生成它们以及在 xCode.

中明确下载和配置适当的配置文件

3. 我已经从设备中删除了所有配置文件,以确保没有过时或配置错误的配置文件导致问题。

4. 我使用相同的产品名称创建了一个空白的 iOS 项目并使用了罪魁祸首的配置文件。添加了上述必要的方法,仍然无法注册通知。

5. 清理了我的构建目录并从测试设备中完全删除了应用程序。

6. 创建了 *.ipa 文件并确认 entitlements are correct.

7. 生成了推送通知服务器的私钥,因为我认为 phone 可能在生成密钥之前无法注册。

上述问题的解决方案是以适当的顺序调用正确的方法。最初假设在 UIApplication 对象上调用 - (void)registerForRemoteNotifications 足以引发适当的成功或失败方法。然而事实并非如此。

开发人员必须首先调用 UIApplication 对象上的 - (void)registerUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings 方法来为各种类型的通知注册应用程序。只有这样做之后,应用程序才能调用 UIApplication 对象的 - (void)registerForRemoteNotifications 方法来注册远程通知。

在这种特殊情况下,来自应用程序 1 的供应配置文件有效,因为该应用程序先前在 运行 时在旧版本 iOS 下被授予权限。

来自 UIApplication 文档

If you want your app’s push notifications to display alerts, play sounds, or perform other user-facing actions, you must call the registerUserNotificationSettings: method to request the types of notifications you want to use.