Уважаемые клиенты Если вы приехали без оформленного заказа, выбранного вами товара может уже не быть в наличии или он будет зарезервирован для другого клиента.
Режим работы: 10:00 - 19:00. Колл-центр: +7 (499) 677-17-72
iOS 18 для инженеров: sysdiagnose, MetricKit и логи — практический разбор

iOS 18 для инженеров: sysdiagnose, MetricKit и логи — практический разбор

Практическое руководство для инженеров, тестировщиков и продвинутых пользователей iOS 18: как инициировать и выгрузить sysdiagnose, подключиться к устройству через Console на Mac, включить профили логирования и использовать MetricKit.

Если вы чините приложения, расследуете падения, ловите деградации производительности или редкие сетевые сбои на iOS 18, вам нужны три инструмента: sysdiagnose, Console и MetricKit. В этой статье собрал рабочие сценарии и чек-листы, чтобы быстро получить материалы и превратить «у меня не работает» в технически полноценный багрепорт.

Что важного в iOS 18 для диагностики

Под капотом у iOS 18 всё так же строится на едином механизме журналирования OSLog: системные и приложенческие сообщения складываются в буферы и доступны через Console и утилиту log на Mac. В iOS 18 Apple усилила приватность (глубже редактируются персональные данные в журналах), но инженерные приёмы не меняются: ставим прицельные фильтры, включаем временно повышенную детализацию с помощью конфигурационных профилей и собираем sysdiagnose при сложности воспроизведения.

Главная идея: минимально достаточный сбор данных под конкретную гипотезу. Это экономит время пользователя, бережёт батарею и даёт читаемый отчёт без информационного мусора.

Sysdiagnose: что внутри и когда собирать

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

  • Проблема редкая или плохо воспроизводится на руках у инженера.
  • Симптомы затрагивают сразу несколько областей (сеть + энергопотребление + UI лаги).
  • Нужно сопоставить краш и состояние системы вокруг него.

Как инициировать sysdiagnose на iPhone

Самый надёжный способ с устройства:

  1. В момент проблемы одновременно нажмите обе клавиши громкости и боковую кнопку на 1–2 секунды, дождитесь лёгкой вибрации.
  2. Дайте устройству 1–3 минуты собрать данные (иногда дольше, не блокируйте экран).
  3. Откройте Настройки → Конфиденциальность и безопасность → Аналитика и улучшения → Данные аналитики и найдите запись, начинающуюся с sysdiagnose_. Размер может быть сотни мегабайт.
  4. Откройте запись и используйте «Поделиться…», чтобы выгрузить архив инженеру или сохранить в Файлы для дальнейшего разбора на Mac.

Если железный жест использовать неудобно (например, пользователь путается с перезапуском), можно временно задействовать AssistiveTouch и назначить на жест запуск sysdiagnose — такой способ часто применяется в полевых тестах.

Что важного внутри архива

  • system_logs и os_logs: единые журналы OSLog за срез времени.
  • spindump: следы зависаний и тупиков в потоках.
  • CrashReporter: последние краши и диагностические отчёты.
  • network: трассировки CFNetwork/NetDiagnostics (если профили включали).
  • performance & power: данные по CPU, памяти, джиттеру, wakeups.

Важно правильно соотнести время воспроизведения проблемы и таймстемпы внутри архива. Попросите пользователя назвать локальное время и пояс часового пояса.

Где найти и выгрузить sysdiagnose на iPhone

Console на Mac: живые логи и фильтры

Приложение Console — основной UI для работы с живыми логами iPhone. Подключите устройство по кабелю, разблокируйте, доверьте Mac — и вы увидите подпункт устройства в боковой панели. Дальше — правила выживания в потоке сообщений.

Базовые фильтры

  • Фильтр по процессу: в поле поиска используйте имя бинаря приложения.
  • Фильтр по подсистеме: subsystem:com.your.bundle или category:Networking.
  • Уровень важности: от default до fault — начните с error/fault, а затем опускайтесь до debug по мере необходимости.

Сохраните отлаженный фильтр как «Saved Search», чтобы не собирать его заново при каждом подключении устройства.

CLI для точного съёма

На Mac доступна утилита log (часть системы). Удобно для воспроизводимых тестов и CI-скриптов:

log stream --level debug --style compact --predicate 'process == "YourApp"' --device
log show --last 10m --predicate 'subsystem == "com.your.bundle" && category == "Network"' --info --style syslog --device

Команда log stream даёт живой поток, log show — исторические записи. Добавляйте точные предикаты по времени и подсистемам, чтобы лог не «плавился» от лишнего.

Профили для расширенного логирования

Конфигурационные профили (.mobileconfig) временно повышают детализацию для конкретных подсистем: CFNetwork, Wi‑Fi, Bluetooth, геолокация, уведомления и др. Стандартная схема работы:

  1. Устанавливаем профиль, перезагружаем устройство (если требуется), фиксируем время установки.
  2. Воспроизводим проблему в узком окне времени.
  3. Собираем sysdiagnose и/или выгружаем логи через Console.
  4. Удаляем профиль, подтверждаем возврат к стандартному уровню логирования.

Профили нельзя держать постоянно: они «шумят» журнал и иногда повышают энергопотребление. Договоритесь с пользователем заранее о временном промежутке и сценарии теста.

MetricKit: метрики и диагностика внутри приложения

MetricKit — системный фреймворк, который агрегирует метрики и диагностические отчёты приложения и периодически доставляет их в само приложение. Это не «живой лог», а сводные данные: производительность, энергопотребление, а также диагностические события (краши, подвисания, перезапуски).

Как включить MetricKit в приложении

Базовая интеграция в Swift выглядит так:

import MetricKit

final class MetricsObserver: NSObject, MXMetricManagerSubscriber {
    func didReceive(_ payloads: [MXMetricPayload]) {
        for payload in payloads {
            // Сериализация в JSON для отправки инженеру
            if let data = try? payload.jsonRepresentation(),
               let json = String(data: data, encoding: .utf8) {
                // Сохранить в файл или отослать по защищённому каналу
                print("MXMetricPayload: \(json)")
            }
        }
    }

    func didReceive(_ payloads: [MXDiagnosticPayload]) {
        for payload in payloads {
            // Краши, подвисания, перезапуски — агрегировано и обезличено
            if let data = try? payload.jsonRepresentation(),
               let json = String(data: data, encoding: .utf8) {
                print("MXDiagnosticPayload: \(json)")
            }
        }
    }
}

// Где-нибудь при старте приложения
let observer = MetricsObserver()
MXMetricManager.shared.add(observer)

MetricKit отдаёт данные не сразу, а партиями (обычно раз в сутки при следующем запуске приложения), чтобы не ухудшать UX. В iOS 18 принцип работы сохраняется: соблюдается приватность, а метрики приходят уже агрегированными.

Какие вопросы решает MetricKit

  • Производительность: длительные кадры, давление на CPU/GPU, память, аллокации.
  • Энергопотребление: будильники, фоновые активности, сетевые сессии.
  • Диагностика: типы выходов приложения, подвисания UI, фатальные сигналы.

Данные MetricKit удобны для трендов: «стало хуже в 18.1?» — видно по средним и перцентилям, а затем уже идём в Console и sysdiagnose за первичными причинами.

Фильтры и поток логов iPhone в Console на Mac

Осмысленный багрепорт: чек-лист

Чтобы инженеру не пришлось неделями уточнять детали, договоритесь о формате отчёта. Рабочий минимум:

  • Шаги воспроизведения: точные шаги, контент/аккаунт (если важно), ожидание vs фактический результат.
  • Окно времени: локальное время начала/окончания теста, часовой пояс.
  • Сборки: версия iOS, модель устройства, версия приложения, билд.
  • Артефакты: sysdiagnose, экспорт логов из Console (фильтр + время), метрики из MetricKit, новые crash-репорты.
  • Конфигурация: установленные профили логирования, сеть (Wi‑Fi/сотовая), VPN/MDM, заряд батареи.
Чем короче и точнее окно, тем полезнее артефакты: 5–10 минут обычно достаточно, чтобы зацепить корень проблемы и не утонуть в шуме.

Практические сценарии

1) «После обновления до iOS 18 всё тормозит»

Гипотезы: изменения в планировщике, давление на память, регресс в анимациях. План:

  1. Соберите 1–2 дня MetricKit, чтобы увидеть тренд по длительным кадрам и памяти.
  2. Воспроизведите лаг в узком окне (например, открытие тяжёлого экрана), снимите sysdiagnose.
  3. Через Console посмотрите subsystem:com.your.bundle + category:UI/Performance, сравните таймстемпы с sysdiagnose.
  4. Если видны блокировки на главной очереди — ищите тяжёлые синхронные операции, большие JSON/имиджи.

2) «Иногда не грузится контент через LTE»

Гипотезы: времена ожидания DNS/TLS, потерянные ретраи, особенности оператора. План:

  1. Установите профиль CFNetwork Logging, воспроизведите 5–10 минут.
  2. Снимите sysdiagnose, а в Console отфильтруйте subsystem:com.apple.CFNetwork и процесс вашего приложения.
  3. Проверьте временные корреляции: начало запроса → резолв → TLS → 1-й байт.
  4. Сверьте ретраи и backoff с политикой клиента. Часто проблема — агрессивные таймауты + плохая радиосетка.

3) «Батарея тает за час»

Гипотезы: частые будильники, лишние фоновые обновления, горячая GPS/камера. План:

  1. Из MetricKit возьмите метрики фоновой активности и wakeups за сутки.
  2. Через Console проверьте subsystem:com.apple.powermetrics вокруг окна деградации.
  3. Снимите sysdiagnose при явном нагреве: смотрим power и sensor дампы.
  4. Ищите «болтающиеся» таймеры, частые pings, Content Refresh без нужды.

OSLog и signpost: метки, которые экономят часы

Если у приложения есть свои логеры — хорошо. Но системный OSLog даёт мощные инструменты, включая signpost-метки для измерения длительности операций и визуального склеивания событий в Console.

import os

let log = Logger(subsystem: "com.your.bundle", category: "Network")
let signposter = OSSignposter(subsystem: "com.your.bundle")

func loadFeed() async throws {
    let state = signposter.beginInterval("FeedRequest")
    log.info("Start feed request")
    defer { signposter.endInterval("FeedRequest", state) }
    // ... сетевой вызов, парсинг
    log.info("Feed request done")
}

В Console такие интервалы группируются, и вы мгновенно видите, где именно «потекло» время: DNS, TLS, парсинг, рендеринг.

Краши: где искать и как сопоставлять

Классические отчёты о падениях доступны на устройстве: Настройки → Конфиденциальность и безопасность → Аналитика и улучшения → Данные аналитики. Они также попадают в Xcode (Устройства и симуляторы → Логи устройств). Но ценность возникает при сопоставлении:

  • Crash timestamp ↔ окно времени в Console и sysdiagnose.
  • Тип сигнала/исключения ↔ недавние изменения в коде.
  • Поток падения ↔ спиндэмпы вокруг (были ли подвисания).

Если падение редкое и несимволицированное, храните dSYM и UUID-соответствия для всех билдов. MetricKit тоже отдаёт диагностические payload’ы с обезличенными стеками — полезно увидеть массу и динамику.

Приватность и безопасность: минимизируем риски

  • Собирайте только то, что нужно: узкое окно, конкретная подсистема.
  • Удаляйте профили после тестов. Не держите «все включено» неделями.
  • Перед передачей журналов проверьте отсутствие токенов, ключей, персональных сообщений и фото-данных.
  • Храните артефакты в защищённых хранилищах, давайте срок жизни ссылкам/файлам.
В iOS 18 расширено редактирование чувствительных данных в журналах, но это не повод игнорировать гигиену: собственные логи приложения должны умолчанию убирать персональные данные.

Типичные ошибки при сборе материалов

  • Лог «за весь день» вместо 5–10 минут вокруг случая — инженеру придётся тратить часы на шум.
  • Сначала включили профили, потом вспомнили сценарий. Делайте наоборот: сценарий → окно → профили → сбор.
  • Нет меток времени и часового пояса — сложно синхронизировать источники.
  • Отсутствуют версии iOS/билда — регрессивный анализ теряет смысл.

Мини‑плейбук: что делать прямо сейчас

  1. Определите симптом и гипотезу (сеть? UI? батарея?).
  2. Соберите окно 5–10 минут Console с точным фильтром по вашему приложению.
  3. Если кейс редкий или системный — снимите sysdiagnose.
  4. В приложении подключите MetricKit и настройте безопасный экспорт payload’ов.
  5. Оформите багрепорт по чек-листу выше и передайте артефакты.

Если нужно подобрать устройство для тестов на разных поколениях железа — загляните в каталог Apple iPhone.

Итоги

iOS 18 не меняет базовые приёмы диагностики, но напоминает о дисциплине: чёткие фильтры, краткие окна, временная детализация через профили и осмысленное использование MetricKit. С этой связкой вы быстро превращаете «мистику» в воспроизводимый сценарий и техническое объяснение. А дальше — фиксы, перетест и контроль трендов по метрикам.

Если нужна отдельная методичка по конкретной подсистеме (Wi‑Fi, Bluetooth, уведомления, геолокация) — напишите, соберём профильный плейбук с примерами предикатов и полями отчётов именно под ваш стек.

Будь в курсе последних предложений

Подпишись и получай информацию об акциях и скидках

На сайте работают cookie!

Нажмите «ОК», если вы соглашаетесь с условиями обработки cookie и данных о поведении на сайте, нужных нам для аналитики. Запретить обработку cookie можете через браузер.

Авторизация
У вас нет аккаунта? Зарегистрироваться
Укажите логин, E-mail или номер телефона, которые вы использовали при регистрации.