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

Posted

技术标签:

【中文标题】提供具有适当权利的配置文件可防止推送通知注册【英文标题】:Provisioning Profile with Proper Entitlements Prevents Push Notifications Registration 【发布时间】:2015-01-26 17:55:57 【问题描述】:

概述

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

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

有问题的问题

应用程序二将触发registerForRemoteNotifications 方法,然后该方法应该调用application:didFailToRegisterForRemoteNotificationsWithError:application:didRegisterForRemoteNotificationsWithDeviceToken:,但它们都不会被调用。

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

测试与调试

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

2. 我已多次重新创建配置文件。我还尝试了让 xCode 自动生成它们以及在 xCode 中显式下载和配置适当配置文件的各种组合。

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

4. 我创建了一个具有相同产品名称并使用罪魁祸首配置文件的空白 ios 项目。添加了上面提到的必要方法,仍然没有成功注册通知。

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

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

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

【问题讨论】:

【参考方案1】:

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

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

在这种特殊情况下,应用程序一的配置文件有效,因为该应用程序之前在旧版本的 iOS 下运行时获得了权限。

来自UIApplication 文档

如果您希望应用的推送通知显示警报、播放声音或执行其他面向用户的操作,则必须调用 registerUserNotificationSettings: 方法来请求您要使用的通知类型。

【讨论】:

以上是关于提供具有适当权利的配置文件可防止推送通知注册的主要内容,如果未能解决你的问题,请参考以下文章

具有通配符和推送通知标识符的 iOS 配置文件

应用商店 Ad Hoc 配置文件无 beta 权利

提交二进制文件进行 Beta 测试:“缺少推送通知权利”

iOS - 可怕的代码签名错误 (0xE8008016) - 推送通知

您的应用似乎包含用于注册 Apple 推送通知服务的 API,但应用签名的权利不包括

为啥我收到此警告“缺少推送通知权利”