Connect with us

Аналитика сбоев и отслеживание ошибок

Используем 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

Какие метрики вы можете отслеживать

Используем MetricKit: что на самом деле делает ваше приложение на устройствах пользователей

Основные понятия, которые необходимо знать

Давайте разберемся с некоторыми ключевыми классами и свойствами, необходимыми для настройки или выполнения действий.

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)
        }
    }
}

Вывод:

Используем MetricKit: что на самом деле делает ваше приложение на устройствах пользователей

Это означает, что приложение работало с 1 полоской сигнала в течение 20 секунд, с 2 полосками в течение 30 секунд и с 3 полосками в течение 50 секунд.

Заключение

MetricKit меняет ваше понимание реальной производительности вашего приложения. Обеспечивая прямой доступ к данным о производительности в реальных условиях, он позволяет выявлять и устранять проблемы, которые могут быть упущены при традиционном тестировании.

С минимальной интеграцией вы получаете доступ в режиме реального времени к производительности вашего приложения. К данным о:

  • Потреблении энергии батареи
  • Сбоях
  • Зависаниях
  • Времени запуска
  • Потреблению памяти и многом другом

Автоматический сбор данных на основе JSON хорошо работает с аналитическими платформами и вашими собственными дашбордами. Независимо от того, исправляете ли вы ошибки или оптимизируете пользовательский опыт, MetricKit позволяет вам выпускать продукты с уверенностью.

Источник

Если вы нашли опечатку - выделите ее и нажмите Ctrl + Enter! Для связи с нами вы можете использовать info@apptractor.ru.
Telegram

Популярное

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: