Swift ios check if remote push notifications are enabled in ios9 and ios10

后端 未结 11 1258
悲哀的现实
悲哀的现实 2020-12-01 02:26

How can I check if the user has enabled remote notifications on ios 9 or ios 10?

If the user has not allowed or clicked No I want to toggle a message asking if they

相关标签:
11条回答
  • 2020-12-01 03:13

    I tried Rajat's solution, but it didn't work for me on iOS 10 (Swift 3). It always said that push notifications were enabled. Below is how I solved the problem. This says "not enabled" if the user has tapped "Don't Allow" or if you have not asked the user yet.

    let notificationType = UIApplication.shared.currentUserNotificationSettings!.types
        if notificationType == [] {
            print("notifications are NOT enabled")
        } else {
            print("notifications are enabled")
        }
    

    PS: The method currentUserNotificationSettings was deprecated in iOS 10.0 but it's still working.

    0 讨论(0)
  • 2020-12-01 03:16

    in iOS11, Swift 4...

     UNUserNotificationCenter.current().getNotificationSettings { (settings) in
            if settings.authorizationStatus == .authorized {
                // Already authorized
            }
            else {
                // Either denied or notDetermined
                UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) {
                    (granted, error) in
                      // add your own 
                    UNUserNotificationCenter.current().delegate = self
                    let alertController = UIAlertController(title: "Notification Alert", message: "please enable notifications", preferredStyle: .alert)
                    let settingsAction = UIAlertAction(title: "Settings", style: .default) { (_) -> Void in
                        guard let settingsUrl = URL(string: UIApplicationOpenSettingsURLString) else {
                            return
                        }
                        if UIApplication.shared.canOpenURL(settingsUrl) {
                            UIApplication.shared.open(settingsUrl, completionHandler: { (success) in
                            })
                        }
                    }
                    let cancelAction = UIAlertAction(title: "Cancel", style: .default, handler: nil)
                    alertController.addAction(cancelAction)
                    alertController.addAction(settingsAction)
                    DispatchQueue.main.async {
                        self.window?.rootViewController?.present(alertController, animated: true, completion: nil)
    
                    }
                }
            }
        }
    
    0 讨论(0)
  • 2020-12-01 03:18

    Apple recommends to use UserNotifications framework instead of shared instances. So, do not forget to import UserNotifications framework. As this framework is new in iOS 10 it's really only safe to use this code in apps building for iOS10+

    let current = UNUserNotificationCenter.current()
    
    current.getNotificationSettings(completionHandler: { (settings) in
        if settings.authorizationStatus == .notDetermined {
            // Notification permission has not been asked yet, go for it!
        } else if settings.authorizationStatus == .denied {
            // Notification permission was previously denied, go to settings & privacy to re-enable
        } else if settings.authorizationStatus == .authorized {
            // Notification permission was already granted
        }
    })
    

    You may check official documentation for further information: https://developer.apple.com/documentation/usernotifications

    0 讨论(0)
  • 2020-12-01 03:23

    If your app supports iOS 10 and iOS 8, 9 use below code

    // At the top, import UserNotifications 
    // to use UNUserNotificationCenter
    import UserNotifications
    

    Then,

    if #available(iOS 10.0, *) {
        let current = UNUserNotificationCenter.current()
        current.getNotificationSettings(completionHandler: { settings in
    
            switch settings.authorizationStatus {
    
            case .notDetermined:
                // Authorization request has not been made yet
            case .denied:
                // User has denied authorization.
                // You could tell them to change this in Settings
            case .authorized:
                // User has given authorization.
            }
        })
     } else {
         // Fallback on earlier versions
         if UIApplication.shared.isRegisteredForRemoteNotifications {
             print("APNS-YES")
         } else {
             print("APNS-NO")
         }
     }
    
    0 讨论(0)
  • 2020-12-01 03:23

    Even though user doesn't allow the push notifications, the device token is available. So it would be also a good idea to check if it's allowed to receive the push notifications.

    private func checkPushNotificationAllowed(completionHandler: @escaping (Bool) -> Void) {
        if #available(iOS 10.0, *) {
            UNUserNotificationCenter.current().getNotificationSettings { (settings) in
                if settings.authorizationStatus == .notDetermined || settings.authorizationStatus == .denied {
                    completionHandler(false)
                }
                else {
                    completionHandler(true)
                }
            }
        }
        else {
            if let settings = UIApplication.shared.currentUserNotificationSettings {
                if settings.types.isEmpty {
                    completionHandler(false)
                }
                else {
                    completionHandler(true)
                }
            }
            else {
                completionHandler(false)
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题