2015-02-10 60 views
17

以下方法保持返回同一值:检查推送通知注册:isRegisteredForRemoteNotifications不更新

[[UIApplication sharedApplication] isRegisteredForRemoteNotifications]; 

这个代码运行每次,结果是YES。即使当我进入“设置”应用程序并为我的应用程序设置“关闭”推送通知时,上面的代码运行时,它的计算结果为YES。

其他详情: *我运行的应用程序上得到了拥有的iOS 8.1.3 *我运行的应用程序在Xcode 6.1的iPhone和我已经得到了手机实际连接到我的机器

任何想法为什么“isRegisteredForRemoteNotifications”的值不会改变?

+1

的可能的复制[检测 “允许通知” 是开/关iOS8上](http://stackoverflow.com/questions/25111644/detect-allow-通知是关闭的ios8) - 请参阅建议使用'currentUserNotificationSettings'的答案。 – 2015-02-10 20:31:14

+0

大多数答案都错误地建议检查“isRegisteredForRemoteNotifications”@AaronBrager – Lefteris 2015-02-10 20:33:21

回答

21

因为iOS 8注册了设备并提供了一个令牌,即使用户选择了推送。

在这种情况下,推不呈现给用户时发送推,但如果你的应用程序正在运行它得到有效载荷,所以你可以在应用程序运行时更新...

要检查推送通知是在iOS 8的激活,您应检查启用用户通知类型:

- (BOOL)pushNotificationsEnabled { 
    if ([[UIApplication sharedApplication] respondsToSelector:@selector(currentUserNotificationSettings)]) { 
     UIUserNotificationType types = [[[UIApplication sharedApplication] currentUserNotificationSettings] types]; 
     return (types & UIUserNotificationTypeAlert); 
    } 
    else { 
     UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes]; 
     return (types & UIRemoteNotificationTypeAlert); 
    } 
} 
1

如果您使用斯威夫特2,位运算符不会UIUserNotificationType工作。下面是使用夫特2,的iOS 8+的溶液:

func hasPushEnabled() -> Bool { 
     //ios 8+ 
     if UIApplication.sharedApplication().respondsToSelector("currentUserNotificationSettings") == true { 
      let settings = UIApplication.sharedApplication().currentUserNotificationSettings() 
      if (settings?.types.contains(.Alert) == true){ 
       return true 
      } 
      else { 
       return false 
      } 
     } 
     else { 
      let types = UIApplication.sharedApplication().enabledRemoteNotificationTypes() 
      if types.contains(.Alert) == true { 
       return true 
      } 
      else { 
       return false 
      } 
}