Аналитика сбоев и отслеживание ошибок
Используем 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 позволяет вам выпускать продукты с уверенностью.
-
Аналитика магазинов2 недели назад
Мобильный рынок Ближнего Востока: исследование Bidease и Sensor Tower выявляет драйверы роста
-
Интегрированные среды разработки3 недели назад
Chad: The Brainrot IDE — дикая среда разработки с играми и развлечениями
-
Новости4 недели назад
Видео и подкасты о мобильной разработке 2025.45
-
Новости3 недели назад
Видео и подкасты о мобильной разработке 2025.46



