【Swift4】iOSでプッシュ通知の設定状況を確認したかった

研究
Skyler Ewing at Pexels
この記事は約2分で読めます。

プッシュ通知でUITabBarのボタンとかに赤いバッチをつけたり、
ステータスの変更を反映したいとか。
なので通知を切られてると激しく困るのです。

まずこれを試しました。

[Swift] iOS でプッシュ通知の有効・無効を判定する – Qiita

バージョン違いで怒られた…珍しくxcodeのfix提案でフィックスできたけど、
設定→通知→アプリごとの通知で意図的に設定したのが、反映できない。
そこを監視できないと正直意味がないんだ。

isRegisteredForRemoteNotifications が正常に動かなかったときの対処 – NANAIRO

PUSH 通知が有効/無効をアプリ上で表示(UISwitch等)して有効にしようとした場合にアプリの設定画面に遷移して有効にしてもらう。 といったことを実装することがあるかもしれません。 実装は「[Swift] iOS でプッシュ通知の有効・無効を判定する 」を見てもらえれば分かりやすいと思います。 それが意図した通りに動かないケースに遭遇しました。 isRegisteredForRemoteNotifications で有効/無効を確認するのですが、PUSH 通知を許可していないのに true になったり、再インストールした時にダイアログが出ている状態なのに true になったりなどです。 registerForRemoteNotifications を呼び出しているしている場所を確認してください。 ドキュメント を見ると application:didRegisterForRemoteNotificationsWithDeviceToken: か application:didFailToRegisterForRemoteNotificationsWithError: 以外からの呼び出しは推奨していないようです。 今回はこれが原因でした。 なので 上記の delegate の中から呼び出すようにすればなおりました。 解決方法で書いたようにちゃんと delegate の中で registerForRemoteNotifications を実行していればこんなことにはならないのですが、何かの役に立つかもしれないので検証した結果を書いておきます。 iOS9.2.1 で下記のコードで検証しました。 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { …

うーん…AppDelegateじゃないと、ダメ?
最終的に

ローカル通知が許可されているか判定する|teratail

これをバージョンで読み替えて

[Swift]Swift2.0からUIUserNotificationTypeのoption設定が変わった – Qiita

フラグがわからなかったのでここで補完

完成品

if (UIApplication.shared.currentUserNotificationSettings?.types.contains( UIUserNotificationType.alert))! {
} else {
// アラートメッセージ表示、別途リサーチしてください
}

失敗

if UIApplication.shared.currentUserNotificationSettings?.types != UIUserNotificationType.alert {
// イコールつけるには型の食い違いで怒られそうなんだけど怒られなかった
}

これで更に、最初のリンクの「アプリの設定画面へ飛ぶ」を実装したいのだけれど
プッシュ通知のみならずGPSも設定してて欲しいので、そちらが可能かどうかをリサーチして見つからなければ合わせない…。

コメント

タイトルとURLをコピーしました