web-dev-qa-db-ja.com

Swift ios ios9およびios10でリモートプッシュ通知が有効になっているかどうかを確認します

ユーザーがiOS 9またはiOS 10でリモート通知を有効にしたかどうかを確認するにはどうすればよいですか?

ユーザーが許可またはいいえをクリックしていない場合、通知を有効にするかどうかを尋ねるメッセージを切り替えます。

47
user2636197

この回答は古く、iOS 10ではサポートされていません。 this answerを確認できます。


このコードを使用

let isRegisteredForRemoteNotifications = UIApplication.shared.isRegisteredForRemoteNotifications
if isRegisteredForRemoteNotifications {
     // User is registered for notification
} else {
     // Show alert user is not registered for notification
}
22
Rajat

Appleは、共有インスタンスの代わりにUserNotificationsフレームワークを使用することをお勧めします。したがって、UserNotificationsフレームワークをインポートすることを忘れないでください。このフレームワークはiOS 10で新しく追加されたため、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
    }
})

詳細については、公式ドキュメントを確認してください。 https://developer.Apple.com/documentation/usernotifications

93
Ogulcan Orhan

Rajatのソリューションを試しましたが、iOS 10(Swift 3)では動作しませんでした。常にプッシュ通知が有効になっていると言っていました。以下に問題を解決した方法を示します。これは、ユーザーが「許可しない」をタップした場合、またはユーザーにまだ質問していない場合は「無効」と表示されます。

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

PS:メソッドcurrentUserNotificationSettingsはiOS 10.0で廃止されましたが、まだ機能しています。

37
tylerSF

アプリがiOS 10およびiOS 8、9をサポートしている場合、以下のコードを使用します

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

次に、

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")
     }
 }
28
Imtee

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)

                }
            }
        }
    }
13
joel prithivi

以下は、iOS 9からiOS 11でSwift 4で動作する現在の許可を説明する文字列を取得するためのソリューションです。この実装では、約束に When を使用します。

import UserNotifications

private static func getNotificationPermissionString() -> Promise<String> {
    let promise = Promise<String>()

    if #available(iOS 10.0, *) {
        let notificationCenter = UNUserNotificationCenter.current()
        notificationCenter.getNotificationSettings { (settings) in
            switch settings.authorizationStatus {
            case .notDetermined: promise.resolve("not_determined")
            case .denied: promise.resolve("denied")
            case .authorized: promise.resolve("authorized")
            }
        }
    } else {
        let status = UIApplication.shared.isRegisteredForRemoteNotifications ? "authorized" : "not_determined"
        promise.resolve(status)
    }

    return promise
}
7
Oscar Apeland

@Rajatの答えは十分ではありません。

  • isRegisteredForRemoteNotificationsは、アプリがAPNSに接続し、デバイストークンを取得していることです。これは、サイレントプッシュ通知に使用できます
  • currentUserNotificationSettingsはユーザー許可用であり、これがない場合、アプリに配信されるアラート、バナー、サウンドプッシュ通知はありません

ここにチェックがあります

static var isPushNotificationEnabled: Bool {
  guard let settings = UIApplication.shared.currentUserNotificationSettings
    else {
      return false
  }

  return UIApplication.shared.isRegisteredForRemoteNotifications
    && !settings.types.isEmpty
}

IOS 10の場合、currentUserNotificationSettingsを確認する代わりに、UserNotificationsフレームワークを使用する必要があります

center.getNotificationSettings(completionHandler: { settings in
  switch settings.authorizationStatus {
  case .authorized, .provisional:
    print("authorized")
  case .denied:
    print("denied")
  case .notDetermined:
    print("not determined, ask user for permission now")
  }
})

プッシュ通知は、さまざまな方法でアプリに配信できます。

UNUserNotificationCenter.current()
  .requestAuthorization(options: [.alert, .sound, .badge])

ユーザーはいつでも設定アプリにアクセスして、それらのいずれかをオフにすることができますので、settingsオブジェクトでそれを確認するのが最善です

open class UNNotificationSettings : NSObject, NSCopying, NSSecureCoding {


    open var authorizationStatus: UNAuthorizationStatus { get }


    open var soundSetting: UNNotificationSetting { get }

    open var badgeSetting: UNNotificationSetting { get }

    open var alertSetting: UNNotificationSetting { get }


    open var notificationCenterSetting: UNNotificationSetting { get }
}
7
onmyway133
class func isRegisteredForRemoteNotifications() -> Bool {
    if #available(iOS 10.0, *) {
        var isRegistered = false
        let semaphore = DispatchSemaphore(value: 0)
        let current = UNUserNotificationCenter.current()
        current.getNotificationSettings(completionHandler: { settings in
            if settings.authorizationStatus != .authorized {
                isRegistered = false
            } else {
                isRegistered = true
            }
            semaphore.signal()
        })
        _ = semaphore.wait(timeout: .now() + 5)
        return isRegistered
    } else {
        return UIApplication.shared.isRegisteredForRemoteNotifications
    }
}
2
Debaprio B

ユーザーはプッシュ通知を許可していませんが、デバイストークンは使用可能です。したがって、プッシュ通知を受信するためにallowedであるかどうかを確認することをお勧めします。

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)
        }
    }
}
2
Joey