我的应用程序在启动时首先使用registerForRemoteNotificationTypes
注册推送通知。
我自然希望didRegisterForRemoteNotificationsWithDeviceToken
事件或didFailToRegisterForRemoteNotificationsWithError
触发。
但是我注意到如果用户的应用程序禁用了推送通知,那么这些都不会被调用。在这种情况下,它是否应该失败并触发didFailToRegisterForRemoteNotificationsWithError
?
问题是,我的应用程序在继续执行其余的网络任务之前等待推送注册的结果(无论是通过还是失败)。在做其他任何事情之前,我基本上都依赖于结果。
我可以使用另一种方法吗?类似于didFailToRegisterForRemoteNotificationsAsDisabledForApplication
(我做了这个)??
修改
Apple Docs对registerForRemoteNotificationTypes
:
发送此消息时,设备会使用Apple Push Service启动注册过程。如果成功,则app委托在应用程序中接收设备令牌:didRegisterForRemoteNotificationsWithDeviceToken:method;如果注册不成功,则通过应用程序通知委托:didFailToRegisterForRemoteNotificationsWithError:方法。如果应用程序委托收到设备令牌,它应该与其提供者连接并将令牌传递给它。
因此,如果用户已对我的应用停用了推送通知,而我的代码正在尝试registerForRemoteNotificationTypes
为什么不会触发didFailToRegisterForRemoteNotificationsWithError
?
答案 0 :(得分:1)
无代表回调
当安装第一个支持推送的应用程序时,iOS或OS X会尝试与推送服务建立持久的网络连接,该服务将由系统上所有支持推送的应用程序共享。如果既没有委托回调应用程序:didRegisterForRemoteNotificationsWithDeviceToken:也没有应用程序:didFailToRegisterForRemoteNotificationsWithError:被调用,这意味着此连接尚未建立。
这不一定是错误条件。系统可能根本没有互联网连接,因为它超出了任何手机信号塔或Wi-Fi接入点的范围,或者它可能处于飞行模式。您的应用应该正常继续,而不是仅将其视为错误,而是仅停用依赖推送通知的功能。
请注意,网络可用性可能会经常变化。一旦与推送服务的持久连接成功,将调用前面提到的应用程序委托方法之一。
在iOS上,即使设备当前正在使用Wi-Fi进行其他网络活动(如网页浏览或电子邮件),推送通知也会尽可能使用蜂窝数据网络。但是,如果蜂窝数据服务不可用,推送服务将回退到Wi-Fi。
如果您的iOS设备能够使用移动数据网络,请检查它是否具有活动的移动数据计划。例如,在“设置”中关闭Wi-Fi,看看是否仍然可以使用Safari浏览网页。另一方面,如果推送服务使用Wi-Fi,则设备或计算机与Internet之间的任何防火墙都必须允许来自端口5223的TCP流量。
重置iOS上的推送通知权限警报 第一次启用推送的应用程序注册推送通知时,iOS会询问用户是否希望接收该应用程序的通知。一旦用户响应此警报,除非设备已恢复或应用程序已卸载至少一天,否则不会再次显示该警报。
如果您想模拟首次运行的应用,可以将应用程序卸载一天。您可以通过以下步骤实现后者而无需等待一天:
从设备中删除您的应用。 完全关闭设备并重新打开。 转到设置>一般>日期&时间并将日期设定为一天或更长时间。 再次完全关闭设备并重新打开。