IOS 8でアプリのローカル通知設定を検出しようとしています
UIUserNotificationSettings
の場合、すべてのバッジ、サウンド、アラートをオンにしたため、7が返されます。
設定では、「通知を許可」をオフにしますが、UIUserNotificationSettings(バッジ、サウンド、アラートオン)の場合、アプリは7を返します。 「Allow Notification
」のオン/オフを検出する方法はありますか?
- (void)application:(UIApplication *)application
didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings{
NSLog(@"---notificationSettings.types %d" , notificationSettings.types );
if(notificationSettings.types!=7){
UIAlertView * alert =[[UIAlertView alloc ] initWithTitle:@"Please turn on Notification"
message:@"Go to Settings > Notifications > App.\n Switch on Sound, Badge & Alert"
delegate:self
cancelButtonTitle:@"Ok"
otherButtonTitles: nil];
[alert show];
}
}
メソッドenabledRemoteNotificationTypes
は、iOS8以降では非推奨です。
IOS8でリモート通知ステータスを確認するには、電話することができます
[[UIApplication sharedApplication] isRegisteredForRemoteNotifications];
ユーザーが設定で通知を無効にすると、NOが返されます。 ドキュメント on isRegisteredForRemoteNotifications
または、現在のすべての通知設定を取得できます。
[[UIApplication sharedApplication] currentUserNotificationSettings];
ドキュメント on currentUserNotificationSettings
Swift 3 +
let isRegisteredForLocalNotifications = UIApplication.shared.currentUserNotificationSettings?.types.contains(UIUserNotificationType.alert) ?? false
Swift 2.
let isRegisteredForLocalNotifications = UIApplication.sharedApplication().currentUserNotificationSettings()?.types.contains(UIUserNotificationType.Alert) ?? false
間違った場所にある場合、この回答/コメントをおIびします。私はiOSプログラミングに本当に新しいので、これまでスタックオーバーフローに投稿したことがありません。これは実際にはコメントであると思いますが、50の評価なしでは許可されません。また、説明が多少初歩的なものであることをおaびしますが、これもまた新しい種類です:)。
また、最初のリクエスト後に、アプリが許可/要求する通知をユーザーが変更したかどうかをテストしたいと思いました。 Appleドキュメンテーション(Appleのライターは私よりもはるかに賢い、またはドキュメンテーションは意図的にわかりにくい))を解読しようとした後、私がテストした価値
[[UIApplication sharedApplication] currentUserNotificationSettings].hash.
これは、ビット1がバナー通知用、ビット2がサウンド通知用、ビット3がアラート通知用である3ビットのハッシュ値を返すと考えています。
そう...
000 = 0 = no notifications.
001 = 1 = only banner,
010 = 2 = only sound,
011 = 3 = sound and banner, no alert
100 = 4 = only alert notifications
and so on until,
111 = 7 = all notifications on.
これは、設定アプリでAllow Notificationsがオフになっている場合も0を示します。お役に立てれば。
呼び出すiOS8およびiOS9のリモート通知ステータスを確認するには:
_// Obj-C
[[UIApplication sharedApplication] isRegisteredForRemoteNotifications];
// Swift
UIApplication.sharedApplication().isRegisteredForRemoteNotifications
_
アプリがリモート通知を受信できる場合、true
を返します。ただし、receiveリモート通知は、displayユーザー。
リクエストregisterForRemoteNotifications()
はほとんどすべての場合に成功し、AppDelegateのdidRegisterForRemoteNotificationsWithDeviceToken
が呼び出され、デバイストークンが提供されます。アプリは、ユーザーに表示されないsilentリモート通知を受信できます。たとえば、このような通知を受け取ったときにアプリでバックグラウンドプロセスをトリガーできます。 ドキュメント を参照してください。
受信するだけでなく、許可を要求するユーザーへのdisplayリモート通知も:
_// Swift
let notificatonSettings = UIUserNotificationSettings(forTypes: [.Badge, .Alert, .Sound], categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(notificatonSettings)
_
これにより、リクエストを許可または拒否できるダイアログがユーザーに表示されます。彼らの決定に関係なく、アプリは引き続きリモート通知を受信できます。
ユーザーが許可すると、AppDelegateのdidRegisterForRemoteNotificationsWithDeviceToken
が呼び出されます。
ユーザーがリクエストを許可または拒否したか、実際に呼び出したiOS設定で通知許可を実際に変更したかどうかを確認するには:
_// Obj-C
[[UIApplication sharedApplication] currentUserNotificationSettings];
// Swift
UIApplication.sharedApplication().currentUserNotificationSettings()
_
ドキュメント を参照してください。
これは、アプリが初めて起動されたときに機能するはずです。ユーザーがダイアログを取得し、ユーザーが通知を拒否または許可するかどうかを確認するには、次を使用します。
-(void)application:(UIApplication *)application didRegisterUserNotificationSettings: (UIUserNotificationSettings *)notificationSettings
{
if (notificationSettings.types) {
NSLog(@"user allowed notifications");
[[UIApplication sharedApplication] registerForRemoteNotifications];
}else{
NSLog(@"user did not allow notifications");
// show alert here
}
}
連続起動では、次を使用します。
[[UIApplication sharedApplication] isRegisteredForRemoteNotifications];
スイフト2
AppDelegateの場合:
func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) {
if (notificationSettings.types == .None){ // User did NOT allowed notifications
}else{ // User did allowed notifications
}
}
他のViewControllerから:
if UIApplication.sharedApplication().currentUserNotificationSettings()!.types.contains(.None){
}else{
}
UIUserNotificationType notificationType = [[[UIApplication sharedApplication] currentUserNotificationSettings] types];
if(notificationType == UIRemoteNotificationTypeNone)
{
NSLog(@"OFF");
}
else{
NSLog(@"ON");
}
私のために働く
UIApplication.sharedApplication().currentUserNotificationSettings()
のハッシュ値を制御できます。
if(UIApplication.instancesRespondToSelector(Selector("registerUserNotificationSettings:"))){
if(UIApplication.sharedApplication().currentUserNotificationSettings().hashValue == 0){
pushNotificationStatus = "false"
} else {
pushNotificationStatus = "true"
}
}
.isRegisteredForRemoteNotifications()
を使用しても動作しません(動作するはずです)。ただし、通知が無効になっている場合、またはいずれかのタイプが存在しない場合、次のコードは機能します。
func notificationsAreOk() -> Bool {
let wishedTypes = UIUserNotificationType.Badge |
UIUserNotificationType.Alert |
UIUserNotificationType.Sound;
let application = UIApplication.sharedApplication()
let settings = application.currentUserNotificationSettings()
if settings == nil {
return false
}
if settings.types != wishedTypes {
return false
}
return true
}
[〜#〜] edit [〜#〜]:通知が無効になっている場合、一部のテストが常に機能するとは限りません。いつ機能するかを知るために、テスト通知を送信することを検討しています。
これをチェックしてください。コードが試行され、テストされます。
- (BOOL)isUserNotificationAllowed {
UIUserNotificationType types = [[UIApplication sharedApplication] currentUserNotificationSettings].types;
if(types & UIUserNotificationTypeBadge || types & UIUserNotificationTypeSound || types & UIUserNotificationTypeAlert){
return YES;
}
else {
return NO;
}
}