Аналитика сбоев и отслеживание ошибок
Используем MetricKit: что на самом деле делает ваше приложение на устройствах пользователей
MetricKit меняет ваше понимание реальной производительности вашего приложения. Обеспечивая прямой доступ к данным о производительности в реальных условиях, он позволяет выявлять и устранять проблемы, которые могут быть упущены при традиционном тестировании.
Представьте себе следующую ситуацию: ваше приложение безупречно запускается во время разработки, с блеском проходит все бета-тесты и получает одобрение для App Store. Но как только оно попадает в руки пользователей… начинается хаос. Появляются сбои, замедления и жалобы на потребление энергии. Звучит знакомо?
Представляем MetricKit — супергерой мира Apple для мониторинга производительности. Представленный на WWDC 2019, этот фреймворк на базе Swift собирает реальные данные о производительности прямо с устройств пользователей.
С MetricKit вы больше не будете действовать вслепую после запуска. Вы получите подробный отчет о том, как ваше приложение ведет себя в производственной среде.
Перед началом работы
Минимальные требования:
- iOS 13.0+, iPadOS 13.0+
- Mac Catalyst 13.0+, macOS 12.0+
- visionOS 1.0+
Почему MetricKit — это спасение
Мониторинг производительности приложений состоит из трех основных этапов.
1. Разработка и бета-тестирование
Вы используете:
- Crashlytics или Xcode Instruments для профилирования
- TestFlight для обратной связи и ранних отчетов о сбоях
2. Производственный разрыв
Как только ваше приложение попадает в App Store, все меняется:
- Реальные пользователи = реальные проблемы: разнообразные устройства, различия в сетях, агрессивная многозадачность
- Проблемы с производительностью теперь зависят от вещей, которые вы не можете смоделировать, таких как плохой сигнал или перегрев батарей
3. MetricKit спешит на помощь
MetricKit собирает данные о производительности непосредственно от пользователей. Это как иметь полетный черный ящик для вашего приложения.
Вы получаете информацию о:
- Сбоях
- Использовании батареи
- Времени запуска
- Зависаниях
- Записи на диск
- Скролинге
- Прекращении работы
- MXSignposts
Какие метрики вы можете отслеживать
Основные понятия, которые необходимо знать
Давайте разберемся с некоторыми ключевыми классами и свойствами, необходимыми для настройки или выполнения действий.
1. MXMetricManager
Ваш основной интерфейс. Он позволяет:
- Получать метрики
- Подписываться на обновления
- Получать доступ к прошлым отчетам
2. MXMetricPayload
Полезная нагрузка, содержащая метрики производительности, такие как использование ЦП и памяти
Отправляется периодически (обычно каждые 24 часа) или когда ваше приложение стабильно используется .
3. MXDiagnosticPayload
Содержит диагностические данные, такие как логи сбоев, отчеты о зависаниях и т.д.
Отправляется немедленно, когда происходит что-то критическое, например сбой.
Внедрим это
MetricKit очень легко интегрировать.
Шаг 1: Импортируем фреймворк
import MetricKit
Шаг 2: Регистрируем подписчика
Используем общий экземпляр MXMetricManager
для регистрации подписчика.
MXMetricManager.shared.add(self)
Обязательно отмените регистрацию подписчика, если он больше не используется.
MXMetricManager.shared.remove(self)
Шаг 3: Реализуем протокол
Следуйте протоколу MXMetricManagerSubscriber
, чтобы получать полезные данные MetricKit через его методы делегата.
extension AppDelegate: MXMetricManagerSubscriber { func didReceive(_ payloads: [MXMetricPayload]) { // TODO: Upload or process metric payload for analysis and visualization } func didReceive(_ payloads: [MXDiagnosticPayload]) { // TODO: Upload or process Diagnostic payload for analysis and visualization } }
Теперь вы получаете реальную информацию о производительности от реальных пользователей!
Как это проверить
Спойлер: симуляторы здесь не помогут
1. Реальные данные
- Доступно только через App Store или TestFlight
- Требует реальных сеансов пользователей
2. Симулированные данные (для отладки)
- В Xcode: Debug > Simulate MetricKit Payload
- Отлично подходит для проверки того, что ваша реализация обрабатывает пейлоад
- Только фиктивные данные — не делайте из них выводов
Реальные случаи использования
1. Комплексный мониторинг производительности
Для целей разработки и тестирования вы можете хранить метрики MXMetricPayload
и MXDiagnosticPayload
в простых файлах .txt.
Однако, когда ваше приложение запущено, лучше всего передавать эти метрики от реальных пользователей непосредственно в ваш бэкэнд, где они могут быть тщательно проанализированы.
Информация может включать:
- Нагрузку на ЦП
- Утечки памяти
- Паттерны сбоев
- Расход батареи и многое другое…
extension AppDelegate: MXMetricManagerSubscriber { func didReceive(_ payloads: [MXMetricPayload]) { var output = """ Date: \(formattedDate()) """ for payload in payloads { let fileName = "MXMetricPayload_\(formattedDate()).txt" if let memoryMetrics = payload.memoryMetrics { output += "\n\nMemory Metrics: \(memoryMetrics.dictionaryRepresentation())" } if let cpuMetrics = payload.cpuMetrics { output += "\n\nCPU Metrics: \(cpuMetrics.dictionaryRepresentation())" } if let diskIOMetrics = payload.diskIOMetrics { output += "\n\ndiskIO Metrics: \(diskIOMetrics.dictionaryRepresentation())" } if let networkTransferMetrics = payload.networkTransferMetrics { output += "\n\nnetworkTransfer Metrics: \(networkTransferMetrics.dictionaryRepresentation())" } if let cellularConditionMetrics = payload.cellularConditionMetrics { output += "\n\ncellularCondition Metrics: \(cellularConditionMetrics.dictionaryRepresentation())" } if let applicationLaunchMetrics = payload.applicationLaunchMetrics { output += "\n\napplicationLaunch Metrics: \(applicationLaunchMetrics.dictionaryRepresentation())" } output += "\n\n\n\nPayload : \(payload.dictionaryRepresentation())" writeUserAccessibleFile(content: "\(output)", fileName: fileName) } } func didReceive(_ payloads: [MXDiagnosticPayload]) { for payload in payloads { let jsonString = payload.dictionaryRepresentation() let fileName = "MXDiagnosticPayload_\(formattedDate()).txt" writeUserAccessibleFile(content: "\(jsonString)", fileName: fileName) } } } extension AppDelegate { private func formattedDate() -> String { let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd_HH-mm-ss" return formatter.string(from: Date()) } func writeUserAccessibleFile( content: String, fileName: String, subdirectoryName: String = "MetricKit Data" ) { guard let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { print("❌ Failed to access documents directory.") return } let targetDirectory = documentsURL.appendingPathComponent(subdirectoryName) do { try FileManager.default.createDirectory(at: targetDirectory, withIntermediateDirectories: true, attributes: nil) let fileURL = targetDirectory.appendingPathComponent(fileName) if FileManager.default.fileExists(atPath: fileURL.path) { try FileManager.default.removeItem(at: fileURL) print("️ Deleted existing file: \(fileName)") } try content.write(to: fileURL, atomically: true, encoding: .utf8) print("✅ File saved at: \(fileURL.path)") } catch { print("❌ Error writing file: \(error)") } } }
Вывод:
2. Анализ сигнала сотовой связи
Отслеживайте, сколько времени приложение работает при различной силе сигнала, используя MetricKit:
extension AppDelegate { func didReceive(_ payloads: [MXMetricPayload]) { for payload in payloads { if let histogram = payload.cellularConditionMetrics?.histogrammedCellularConditionTime { for bucket in histogram.bucketEnumerator { if let bucket = bucket as? MXHistogramBucket { let start = bucket.bucketStart.value let end = bucket.bucketEnd.value let count = bucket.bucketCount print("Signal Bars: \(start)-\(end), Time spent: \(count) seconds") } } } } } func didReceive(_ payloads: [MXDiagnosticPayload]) { for payload in payloads { let jsonString = payload.dictionaryRepresentation() let fileName = "MXDiagnosticPayload_\(formattedDate()).txt" writeToFile(content: "\(jsonString)", fileName: fileName) } } }
Вывод:
Это означает, что приложение работало с 1 полоской сигнала в течение 20 секунд, с 2 полосками в течение 30 секунд и с 3 полосками в течение 50 секунд.
Заключение
MetricKit меняет ваше понимание реальной производительности вашего приложения. Обеспечивая прямой доступ к данным о производительности в реальных условиях, он позволяет выявлять и устранять проблемы, которые могут быть упущены при традиционном тестировании.
С минимальной интеграцией вы получаете доступ в режиме реального времени к производительности вашего приложения. К данным о:
- Потреблении энергии батареи
- Сбоях
- Зависаниях
- Времени запуска
- Потреблению памяти и многом другом
Автоматический сбор данных на основе JSON хорошо работает с аналитическими платформами и вашими собственными дашбордами. Независимо от того, исправляете ли вы ошибки или оптимизируете пользовательский опыт, MetricKit позволяет вам выпускать продукты с уверенностью.
-
Видео и подкасты для разработчиков3 недели назад
Пагинация: от идеи до реализации
-
Новости3 недели назад
Видео и подкасты о мобильной разработке 2025.25
-
Видео и подкасты для разработчиков3 недели назад
История, принципы и концепции библиотеки навигации Decompose
-
Исследования3 недели назад
Bidease: мобильный маркетинг 2025 — баланс AI, удержания и конфиденциальности