isRegisteredForRemoteNotifications 总是返回 no
Posted
技术标签:
【中文标题】isRegisteredForRemoteNotifications 总是返回 no【英文标题】:isRegisteredForRemoteNotifications always returns no 【发布时间】:2015-01-30 18:26:22 【问题描述】:我收到了弹出窗口,我已接受,我在通知中看到它并且它已打开,但此代码始终返回 no,我似乎无法找出原因
UIApplication *application = [UIApplication sharedApplication];
BOOL enabled;
// Try to use the newer isRegisteredForRemoteNotifications otherwise use the enabledRemoteNotificationTypes.
if ([application respondsToSelector:@selector(isRegisteredForRemoteNotifications)])
enabled = [application isRegisteredForRemoteNotifications];
else
UIRemoteNotificationType types = [application enabledRemoteNotificationTypes];
enabled = types & UIRemoteNotificationTypeAlert;
if (enabled)
NSLog(@"is registered");
else
NSLog(@"is not registered");
【问题讨论】:
当你注册通知是UIRemoteNotificationTypeAlert
你注册的类型之一?
【参考方案1】:
我认为导致它发生的原因可能是:
-
isRegisteredForRemoteNotifications 将始终返回 NO 在
模拟器。
registerForRemoteNotifications 失败。
【讨论】:
【参考方案2】:我也在为同样的问题苦苦挣扎,这对我有用。
BOOL enabled = NO;
UIUserNotificationSettings *notificationSettings = [SharedApplication currentUserNotificationSettings];
enabled = notificationSettings.types < 4;
【讨论】:
#define SharedApplication [UIApplication sharedApplication] 这很有可能实际上是在骗你。如果您还没有注册远程通知,您仍然可以设置通知设置,因此这可能会返回 true,而实际上它是 false。您应该依赖isRegisteredForRemoteNotifications
中的返回值,如果返回的是 NO
,这意味着您注册远程通知时出现问题。
notificationSettings.types > 0
是一种更好的方法。 7 表示启用了横幅、声音和警报,但由于 7 > 4 会返回 false【参考方案3】:
根据 Apple 文档,如果注册未发生、失败或被用户拒绝,isRegisteredForRemoteNotifications
将返回 NO
。 YES
如果应用注册了远程通知并收到了设备令牌,将返回。因此,在回答您的问题 NO 时,它不会总是返回 no
,如果您的应用已注册远程通知并且它已收到设备令牌,它也会返回 yes
。
Checkout the Apple Documentation for a better description
返回值
YES
(如果应用已注册远程通知并收到其设备令牌)或NO
(如果注册尚未发生、失败或被用户拒绝)。讨论
此方法仅反映在您调用
registerForRemoteNotifications
方法时开始的远程注册过程的成功完成。由于连接问题,此方法不反映远程通知是否实际可用。该方法返回的值考虑了用户接收远程通知的偏好。
【讨论】:
【参考方案4】:我认为模拟器总是会返回no
,尝试在真实设备上运行您的代码,看看行为是否继续
【讨论】:
【参考方案5】:在 ios10 之后,为了让它在模拟器和真实设备上都能正常工作,你应该使用这样的东西:
[[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings)
if (settings.alertStyle == UNAlertStyleNone)
NSLog(@“ACCESS DENIED!”);
else
NSLog(@“ACCESS GRANTED!”);
];
如果您不打算在模拟器上进行测试,您可以使用下面的代码(不幸的是,这将始终在模拟器上返回 NO):
[[UIApplication sharedApplication] isRegisteredForRemoteNotifications];
如果您计划为 iOS 10 或 iOS11 编译,请勿使用以下代码,因为它在 iOS10 上已被弃用:
[SharedApplication currentUserNotificationSettings];
【讨论】:
【参考方案6】:在我的情况下,[UIApplication sharedApplication].isRegisteredForRemoteNotifications
在后台模式 > 远程通知功能尚未打开时始终为“否”。
【讨论】:
以上是关于isRegisteredForRemoteNotifications 总是返回 no的主要内容,如果未能解决你的问题,请参考以下文章