目次
Why is my app getting killed
https://developer.apple.com/videos/play/wwdc2020/10078/概要
- Appがbackgroundで終了してしまう6つの主な原因を説明
- 終了する確立をへらす鍵となる統計データを特定するのに役に立つMetricKitの使用方法の説明
- 問題発生の予防方法
- リカバーする方法
- 潜在的な問題を特定し、解決するためにやるべき方策を伝える
- 特にテキスト入力時や音声再生中など、ステータス復元を実装する重要正を共有
終了する6つの主な原因
- Crash
- CPUリソースの限界
- Watchdog
- Memoryの制限を超える
- Memoryの負荷が高い
- Backgroudでの処理がtimeoutする
Crash
Metric API
Xcode Organizerに追加された機能 MXBackgroundExitDataは強制終了時のtypeをカウントする CrashはXcode Organizerで詳細に確認可能Xcode Organizerについて詳細に知りたい場合は、WWDC 2018のUnderstanding Crashes and Crash Logsを確認 Metric Kitについて詳細に知りたい場合は WWDC 2020のWhat’s new in MetricKitを確認
Watchdog
起動、backgroundへの移行、再びforegroundへの移行などの主要なアプリの遷移中の長いハングアップで、これらの遷移には20秒程度の制限時間がある 終了時には MXCrashDiagnosticで検出、確認可能
CPU Resource Limit
Backgroundで高いCPUの利用があった場合に、Energy Exception Reportを生成する Energy Exception ReportはXcode Organizerで確認でき、MXCPUExceptionDiagnosticで検出、確認可能コードのどこでCPUの負荷がかかっているのかが簡単に把握することが出来る
Memory footprint Exceeded
Instrumentsを利用するとMemoryを多く使用しているコードを把握することが出来るiPhone 6sをサポートする場合、200MB以下に抑えることが理想
Memory pressure exit (jetsam)
他のアプリケーションとの並用によりMemory使用率が上がり、自身のアプリをbackgroundで継続して稼働し続けていても終了することがある。キャッシュやディスクから読み込んだリソースを解放し、backgroundでは50MB以下に抑えることが理想
Recorvery from jetsam
自身のアプリでMemoryの使用を抑えても、ユーザのアプリの利用方法や他のアプリによっては必ずしもcrashしないわけではない。例えば、カメラアプリを利用して短時間に何枚も写真を撮るなど。 このような状況を考慮し、ユーザがアプリに戻った時に再起可能な状態にしておくことが重要
Background task timeout
ユーザをアプリがcrashする前の状態に再起さためのAPIとして beginBackgroundTaskWithName:expirationHandler:の使用すると良い foregroundからbackgroundに遷移する際には、UIApplication beginBackgroundTaskを呼び出すことで、重要な作業を終了させるための余分なランタイムを得ることが可能。作業が終わったら、endBackgroundTaskを呼び出します。
Expiration Handler
beginBackgroundTaskへのすべての呼び出しにExpiration Handlerを提供するのは良い習慣です