📱

顔認証時も意図せず呼ばれるapplicationDidBecomeActive() : iOSライフサイクルイベントの罠

に公開

はじめに

こんにちは、iOSエンジニアの長です。

iOSアプリを開発していると、アプリのライフサイクルイベントに関する挙動で思わぬ問題に直面することがあります。
その中でも特に注意が必要なのが、applicationDidBecomeActive()が意図しないタイミングで呼ばれるケースです。

本記事では、ウェルスナビアプリで発生した顔認証(Face ID)時に呼ばれるライフサイクルイベントに関する問題について解説し、解決策を紹介します。

問題の概要

ウェルスナビアプリでは、アプリがフォアグラウンドに復帰する際に必要な処理を applicationDidBecomeActive() 内に記述していました。
そのため、意図しないタイミングでフォアグラウンド復帰時の処理が実行されていました。

applicationDidBecomeActive()は、アプリがアクティブ状態に遷移した際に呼び出されるライフサイクルイベントのメソッドです。
通常、このメソッドはアプリがバックグラウンドからフォアグラウンドに戻ったときや、起動直後に呼ばれることを想定しています。

しかし、ライフサイクルの仕様で顔認証後でもこのメソッドが呼ばれてしまいます。

  1. アプリは一時的に非アクティブ状態(applicationWillResignActive()が呼ばれる)になり、Face ID認証が表示される

  2. 認証が完了またはキャンセルされた後、applicationDidBecomeActive()が呼び出される

問題解決のアプローチ

フォアグラウンド復帰時の処理を applicationWillEnterForeground に移動させ、
applicationDidBecomeActive()が意図しないタイミングで呼ばれる問題を解決しました。

- func applicationDidBecomeActive(_ application: UIApplication) {
+ func applicationWillEnterForeground(_ application: UIApplication) {
     // アプリがフォアグラウンドに復帰する際の処理
}

また、一部の処理は、RxSwiftの UIApplication.rx.didBecomeActive を利用していたため、こちらも同様に置き換えました。

- UIApplication.rx.didBecomeActive
+ UIApplication.rx.willEnterForeground

さいごに

iOSアプリのライフサイクルイベントは、アプリの挙動を制御する上で非常に重要です。
一方で、特定のシナリオでは予期せぬ挙動が発生する可能性があります。
本記事で紹介したように、適切なイベントの利用により、期待通りのアプリケーションの挙動が実現できます。

今回のケースが皆さんの開発に役立つヒントとなれば幸いです。

WealthNavi Engineering Blog

Discussion