eSenseアプリを開発中に「Message from debugger: Terminated due to signal 9」が発生し、アプリがバックグランド状態で落ちている事が判明。バックグランド状態では、CPU利用率が80%を連続して60秒を超えるとiOSがアプリを強制終了する仕様みたい。原因発見までの手順と対策をメモ。
「Message from debugger: Terminated due to signal 9」の具体的な原因が分からなかったので調べてみると、Xcodeの「Window →Devices and Simulators」から詳細を確認できるとのこと(本リンクを参照)。対象アプリのクラッシュログを確認すると、以下のように表示されていた。
Event: cpu usage Action taken: Process killed CPU: 48 seconds cpu time over 59 seconds (82% cpu average), exceeding limit of 80% cpu over 60 seconds CPU limit: 48s Limit duration: 60s CPU used: 48s Duration: 8.03s Steps: 6
どうやらCPU利用率80%を60秒続けると強制終了させられるみたい。試しにCPUレポートから調べると、常時80%を超えていた。CPU利用率の原因を調べると、BLE通信やセンサデータ処理自体はそんなにCPUを食っていない。どうやらセンサデータを描画する処理が重いみたい。
バックグランド状態でも描画処理はフォアグランド時と同様に走ってるらしく、バックグランド時には表示を更新しない条件分岐を追加した。アプリの状態判定はUIApplicationからチェックできる。
if UIApplication.shared.applicationState == .active { }else if UIApplication.shared.applicationState == .inactive { }else if UIApplication.shared.applicationState == .background { }
上記の条件分岐を追加すれば、100Hzでセンシングをしてもバックグランド状態で強制終了する事なくセンシングが可能になった。
Categories: