Swift アプリが未起動(強制終了された)・落ちた状態で通知をタップされた時の動き

Swift Swift
Swift

iOSアプリを作成している時に、プッシュ通知の機能を利用している場合、通知をタップしてアプリを起動する動作が発生します。
その際に、アプリが起動中の時と、アプリが未起動「(強制終了された)・落ちた状態・ユーザーにより終了された(アプリ履歴の画面でスワイプ操作でアプリを終了)」の時とで動きが異なり戸惑ったので、メモ・・・

確かに冷静に考えれば当然なのだが、処理の順番に惑わされました・・・

アプリが起動済みの場合の通知タップ時の処理

scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)

上記のメソッドが通知をタップした時に実行されるメソッドで、ここに任意の処理を書く。

基本的には、この部分から処理がスタートするので、特に難しい事は無かったです。

アプリが未起動「(強制終了された)・落ちた状態・ユーザーにより終了された(アプリ履歴の画面でスワイプ操作でアプリを終了)」の場合の通知タップ時の処理

アプリが起動済みの場合に実行されるメソッドと同じ部分が実行されます。

scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)

プラス、初回起動なので、SceneDelegate.swift内の処理が走ります。
その後、下記の通知タップ時の処理が実行されます。

userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void)

調べた感じでは、先にSceneDelegate.swiftのメソッドscene(_ scene: UIScene, willConnectTo session: UISceneSession,・・・が実行され、その後すぐに、userNotificationCenterが実行されました。
※実際どっちが確実に先にスタートし始めるのか・・・確実な情報が知りたい・・・

通知タップによりアプリが初めて起動されたので、当然っちゃ~当然の事ですね・・・

困ってた事・・・

実際に起っていたのは、通知タップの動作によりViewを開く処理を書いていました。
起動済みの場合は問題なかったのですが、未起動の場合、Viewをちゃんと開けたり、開けなかったりしました・・・
アプリ自体は通知タップで開くが、Viewが開いたり、開かなかったり・・・

未起動の場合だけ、動作が不安定でした。

原因は、userNotificationCenterのメソッドとsceneのメソッド内で書かれた処理が同時に実行されているような状態なので、その事を考慮して処理を書かないといけないと気付きました・・・

アプリが起動済みの時と、未起動の時で実行されるメソッドが異なるので、処理の内容によっては、
どの処理が先に実行されるか、状況によって変わることになります。
処理内容が重ければ後で到達するし、軽ければ先に到達するし・・・

冷静に考えれば当然なのですが、何で結果が不安定なんだろう・・・?
と悩む事になってしまました・・・(-_-;)

コメント

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