見出し画像

バックグラウンドで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"にある。

画像2

・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は「診断」。

画像3

MetricKitを有効化すると、オペレーティングシステムはDiagnosticデータを収集し、24時間分のペイロードにまとめられる。これがMXMetricPayloadオブジェクト。

画像4

MXDiagnostic

MXDiagnosticは抽象クラスで、

画像5

実際には

・MXHangDiagnostic
・MXCrashDiagnostic
・MXDiskWriteExceptionDiagnostic
・MXCPUExceptionDiagnostic

として得られる。

アプリ停止の主な要因

ここから先は

5,737字 / 3画像
昨年は書籍という形にまとめましたが、今年はこのマガジンに集約することにしました。 最初は記事が少ないので格安から開始して、充実してくるごとに本来あるべき価格に戻していく予定です。というわけで早いうちに買うと非常にお得です。 昨年の書籍は約80ページ+本に載せなかった事項もたくさん、ということで最終的にはそれなりの量になるのではと思います。

堤がWWDC 2020およびiOS 14についてセッションやサンプルを見つつ勉強したことを記事にしていくマガジンです。NDAの都合上、Ap…

最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/