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 &gt; 0 是一种更好的方法。 7 表示启用了横幅、声音和警报,但由于 7 > 4 会返回 false【参考方案3】:

根据 Apple 文档,如果注册未发生、失败或被用户拒绝,isRegisteredForRemoteNotifications 将返回 NOYES 如果应用注册了远程通知并收到了设备令牌,将返回。因此,在回答您的问题 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的主要内容,如果未能解决你的问题,请参考以下文章