ユーザーがiOS 9またはiOS 10でリモート通知を有効にしたかどうかを確認するにはどうすればよいですか?
ユーザーが許可またはいいえをクリックしていない場合、通知を有効にするかどうかを尋ねるメッセージを切り替えます。
この回答は古く、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
}
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
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で廃止されましたが、まだ機能しています。
アプリが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")
}
}
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)
}
}
}
}
以下は、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
}
@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 }
}
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
}
}
ユーザーはプッシュ通知を許可していませんが、デバイストークンは使用可能です。したがって、プッシュ通知を受信するために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)
}
}
}