До MetricKit
Отслеживание сбоев вашего приложения и других незапланированных завершений жизненно важно для мониторинга работоспособности вашего приложения. До MetricKit разработчики iOS полагались на сторонние решения для отслеживания любых сбоев приложений и ошибок OOM (Out Of Memory). Crashlytics, Instabug или AppMetrica — инструментов для этого много, но даже они не гарантировали точных данных об OOM. Это связано с тем, что когда происходит OOM, ваше приложение уничтожается системой, и у него нет времени среагировать или попытаться зарегистрировать событие. Вот почему разработчики полагались на различные эвристики при запуске приложения, чтобы определить, произошло ли OOM.
Пример проверки из статьи команды Compass изображен ниже.
Если этого недостаточно, вот интересная статья о том, почему такие сторонние репортеры о крешах — плохая идея.
С MetricKit
Apple представила MetricKit в 2019 году с iOS 13, но в то время у фреймворка не было особо многого возможностей. С iOS 14 MetricKit получил гораздо больше функционала. Теперь вы могли отслеживать диагностическую информацию о прекращении работы и сбоях ваших приложений не чаще одного раза в 24 часа. В iOS 15 это было расширено до мгновенных обновлений информации.
Все, что вам нужно сделать, это получить общий экземпляр MXMetricManager, подписаться на его обновления и внедрить протокол MXMetricManagerSubscriber.
После подписки на обновления MXMetricManager вы начнете получать MXMetricPayload вместе с MXDiagnosticPayload. MXMetricPayload содержит applicationExitMetrics, который содержит foregroundExitData и backgroundExitData. Как можно догадаться по именам, foreground данные выхода соответствуют случаям, когда приложение было завершено, находясь на переднем плане — из-за сбоя, OOM, завершения пользователем и т.д.
Для всех типов завершения посмотрите документацию Apple.
Получение количества OOM для вашего приложения
В этом примере я просто извлеку количество OOM из MXMetricPayload и отслежу их в кастомном классе MetricManager.
- В AppDelegate.swift добавляем импорт MetricKit
- В didFinishLaunchingWithOptions в AppDelegate.swift добавляем свой metricManager в качестве подписчика на MXMetricManager.
//metricManager is instance of your custom MetricManager class //you might want to use your dependency injection solutions to //initialize it MXMetricManager.shared.add(metricManager)
- Внутри вашего класса MetricManager реализуем методы для протокола MXMetricManagerSubscriber.
extension MetricManager: MXMetricManagerSubscriber { func didReceive(_ payloads: [MXMetricPayload]) { // these payloads contains information on your app exits // both foreground and background for payload in payloads { if let appExitMetrics = payload.applicationExitMetrics { let oomCount = appExitMetrics.foregroundExitData.cumulativeMemoryResourceLimitExitCount //TODO: track this OOM count based on your needs } } } func didReceive(_ payloads: [MXDiagnosticPayload]) { // this payload contains information for your crashes // along with crashlogs } }
Вывод
В этом примере мы получили только подсчет количества ошибок OOM для приложения, которое работает. MetricKit содержит гораздо больше данных, которые могут помочь вам отслеживать работоспособность вашего приложения и делать ваших пользователей счастливее :)
Удачного программирования!