バックグラウンドでkillされた理由を知る - MetricKitの新機能 #WWDC20 #iOS14
MetricKitはiOS 13で追加されたフレームワーク。正直その存在に気付いてすらなかったのだが、なんとバックグラウンドでkillされる理由を検知できるとの情報が。
Core Bluetoothを利用した外部ハードウェアと連携するアプリ、音声を扱うアプリ、位置情報を使うアプリ、etc...と過去に様々なバックグラウンドで動作するアプリをつくってきたが、
「iOSがプロセスをkillすることがある」というのはメモリやCPUをあまり使わないようにするというなんとなくの指針はあれど実のところはいつどういう理由でkillされたかもわからないので、なんというかそこはもう諦めるしかない領域だと思っていた。
が、iOS 14でMetricKitに追加された新API群を使えば、これらの原因がわかるらしい。しかも、ユーザーが手動でkillしたというのもわかるらしい。素晴らしすぎる。
というわけで、以下WWDC 2020の"Why is my app getting killed?"(なぜ私のアプリはkillされてしまうのか?)と、"What's new in MetricKit"という2つのセッションを見たうえで、MetricKitを用いてバックグラウンドでアプリがkillされる要因を調査する方法について調べたメモ。
MetricKitの基本的な実装方法
簡単な実装解説は"What's new in MetricKit"にある。
・MXMetricManagerSubscriberに準拠したクラス(Subscriberクラスとする)を作っておき、
・MXMetricManagerを初期化し、addメソッドでSubscriberのオブジェクトを渡す。以上。
import MetricKit
class MySubscriber: NSObject, MXMetricManagerSubscriber {
var metricManager: MXMetricManager?
override init() {
super.init()
metricManager = MXMetricManager.shared
metricManager?.add(self)
}
override deinit() {
metricManager?.remove(self)
}
func didReceive(_ payload: [MXMetricPayload]) {
for metricPayload in payload {
// Do something with metricPayload.
}
}
}
MXMetricManagerSubscriberプロトコルのfunc didReceive(_:)メソッドの引数からMXMetricPayloadオブジェクトの配列を得られる。
MXDiagnosticPayload
iOS 14では、MXMetricManagerSubscriberプロトコルに次のメソッドが追加された。
optional func didReceive(_ payloads: [MXDiagnosticPayload])
` didReceive([MXMetricPayload])`の方は実装必須だが、こちらはoptional。
MXDiagnosticPayloadもiOS 14の新クラスで、複数のMXDiagnosticオブジェクト(こちらも新クラス)を持っている。Diagnosticは「診断」。
MetricKitを有効化すると、オペレーティングシステムはDiagnosticデータを収集し、24時間分のペイロードにまとめられる。これがMXMetricPayloadオブジェクト。
MXDiagnostic
MXDiagnosticは抽象クラスで、
実際には
・MXHangDiagnostic
・MXCrashDiagnostic
・MXDiskWriteExceptionDiagnostic
・MXCPUExceptionDiagnostic
として得られる。
アプリ停止の主な要因
ここから先は
#WWDC2020 の勉強メモ
堤がWWDC 2020およびiOS 14についてセッションやサンプルを見つつ勉強したことを記事にしていくマガジンです。NDAの都合上、Ap…
最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/