Crashes

Критические сбои (CRASH) обозначают неожиданное или аварийное завершение работы приложения из-за ошибки или необработанного исключения. Помимо негативного пользовательского опыта возникновение таких проблем может привести к потере данных, а потому требует эффективных механизмов и инструментов для их обнаружения и решения. Отчёты о полученных Tracer-ом сбоях и графики по событиям можно найти в разделе «Сбои». За отправку данных о событиях типа CRASH отвечает FeatureConfiguration.crashReporter.

ВАЖНО! Tracer хранит данные о событиях за последние 90 дней.

Для того чтобы оценить надежность приложения и его способность сохранять работоспособность в течение продолжительного периода, Tracer позволяет рассчитывать crash-free – процент пользователей, у которых не возникало сбоев в работе приложения за выбранный период. Рассчитывается метрика как (1 - (Пользователи со сбоем / Все пользователи)) * 100%. При этом важно понимать, что использование приложения на разных устройствах одного пользователя будет обозначено как самостоятельныя единица при расчётах. Переустановка приложения на текущем устройстве также генерирует новую самостоятельную единицу, но только в случае, если на устройстве на момент установки нет приложений этого вендора. Отвечает за фичу настройка в .crashReporter.

Для отслеживания некритических сбоев (или пользовательских событий) – NON_FATAL – есть отдельный инструмент.

Подключение зависимостей к проекту

Для cocoapods Podfile:

source 'https://github.com/odnoklassniki/tracer-ios.git' pod 'OKTracer'

Для создания и запуска Tracer используются TracerFactory – статическая фабрика для удобства создания типовых настроек, и TracerService – он объединяет все сервисы и возможности и обрабатывает их делегаты. Самым быстрым способом создания Tracer в вашем проекте и будет использование TracerFactory с типовой настройкой tracerServiceForCrashReporting – в неё остаётся лишь передать appToken вашего приложения.

import OKTracer let tracerService = TracerFactory.tracerServiceForCrashReporting(token: "Ваш appToken") tracerService.start()

Существует также способ комбинированного запуска Tracer с использованием FeatureConfiguration. При таком подключении Tracer возможно более тонко задать необходимые настройки. В FeatureConfiguration необходимо указать нужные FeatureType (опции) Tracer-а, которые хочется использовать в вашем приложении. Для отслеживания крэшей вам понадобится .crashReporter. .assertReporter отвечает за NON_FATAL-ы, прочитать об этом инструменте подробнее можно в разделе о NON_FATAL-ах.

import OKTracer let features: [FeatureConfiguration] = [ .crashReporter(maxUploadsCount: 3, shouldUseHack: false), // другие опции, которые хочется подключить ] let configuration = Configuration(token: "Ваш appToken", features: features) let tracerService = TracerFactory.tracerService(configuration: configuration) tracerService.start()

Описание FeatureConfiguration.crashReporter

За инициализацию .crashReporter отвечает TracerCrashReporterConfiguration – в ней есть несколько параметров, отвечающих за отправку событий определенных типов.

ПараметрТипОписание
maxUploadsCountIntМаксимальное количество отчетов в вытесняющейся очереди. По умолчанию 3.
shouldUseHackBoolОтвечает за включение/выключение экспериментального способа перехвата сбоев. По умолчанию false.
useTrackSessionBoolОтвечает за включение/выключение отслеживания сессий. Впоследствии данные преобразовываются в статистику crashFree. По умолчанию true.

Обработка сбоя приложения после перезапуска

В TracerService есть инструменты, которые позволяют узнать состояние предыдущей завершенной сессии. Это может быть полезно для обработки сбоя приложения после его перезапуска. Отвечает за это опция lastSessionState() от делегата TracerServiceProtocol, которая возвращает одно из двух состояний:

СостояниеЗначение
crashedПредыдущая сессия завершилась со сбоем.
normalПредыдущая сессия завершилась без сбоев.

Каждое из значений хранит crashCount – количество сбоев, которое еще не было отправлено на сервер по различным причинам. При этом для crashed указан статус отправки сбоя: success при успешной отправке и failure, если при отправке сбоя произошла ошибка. Детали предыдущей сессии можно уточнить в CrashReporterModelProtocol:

ПараметрТипОписание
versionCodeInt?Номер сборки приложения, в котором зафиксирован сбой.
versionNameString?Название сборки приложения, в котором зафиксирован сбой.
processNameString?Название процесса, в котором зафиксирован сбой.
textStringСообщение, переданное с зафиксированным сбоем.
timestampDate?Момент, в который зафиксирован сбой.
startTimeDate?Момент запуска приложения.
osVersion String?Версия операционной системы устройства, на котором произошёл сбой.

Пример использования .lastSessionState():

switch tracerService.lastSessionState() { case let .normal(crashCount): print("В последней сессии сбоев не было. Не отправлено \(crashCount) сбоев.") case let .crashed(crashCount, result): print("В последней сессии был сбой. Не отправлено \(crashCount) сбоев.") switch result { case let .success(crashModel): print("Время последнего сбоя\(crashModel.timestamp). Время последнего запуска приложения \(crashModel.startTime).") case let .failure(error): print("При получении последнего сбоя произошла ошибка \(error)") } }

Далее – отправка пользовательских ошибок (NON_FATAL).