時刻を設定すると、その時刻になるとアラームを出すアプリを作成中。こういった処理は、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 の方がまだわかりやすくていいなぁと思いました。