2015-02-10 30 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 
      } 
}