設定、app、通知 が許可になっているのか調べるには・・・

時刻を設定すると、その時刻になるとアラームを出すアプリを作成中。こういった処理は、UNNotification を使って作成するのが iOS 10 からの流れのようで、UINotification の時代から大して慣れていない中、やっとこさっとこ意味のある機能を作ることができました。

端末が通知を許可しているか、許可していないかを調べる方法がわからなくて、色々試行錯誤してようやくわかりました。そもそもなんで許可しているかどうかを知りたかったかと言えば、タイマーをセットしようとして、時間が来たらアラートを出すのですが、端末が許可されていないと、fire しても発火しない(アラートが出ない)からです。

具体的な方法は、AppDelegate.m に以下のメソッドを定義します。

- (void) isNotificationsAuthorization:(void (^)(BOOL isActive)) handler

{

    [[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings* _Nonnull settings)

    {

        //settings.alertStyle == UNAlertStyleNone;

        NSLog(@"settngs: %ld", settings.authorizationStatus);

        if ( settings.authorizationStatus == UNAuthorizationStatusAuthorized )

        {

            // NSLog(@"Authorized");

            handler(YES);

        }

        else

        {

            // NSLog(@"Denied");

            handler(NO);

        }

    }];

}

このメソッドを呼び出すと、YES が返って来れば、端末は通知を許可していることになります。一方、NO が返って来れば、許可していないということです。このメソッドを呼び出すのは次のようにします。

        AppDelegate* appdelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

        [appdelegate isNotificationsAuthorization:^(BOOL isActive)

         {

             if ( isActive )

             {

                 NSLog(@"notification setting: YES");

             }

             else

             {

                 NSLog(@"notification setting: NO");

             }

         }];

isActive の状況に応じて分岐できるので、例えば設定されていないことが分かれば、そこで「設定してください」のアラートを出すことができます。

というわけで、こんな感じでできることがわかって、良かった・よかったなんですが、余談もひとつ。

最近ネット上に Objective-C の記述が少なくて、そろそろ情報が増えて来た Swifit にしようかなと思い始めたところです。でも、Swift のコードを見ると、クロージャとかの記述は Objective-C とあんまり変わらず見にくい(醜い)ので、そうであれば、Objective-C の方がまだわかりやすくていいなぁと思いました。