Crashlytics iOS — исключение, обнаруженное в журнале

Я нашел способ регистрации пользовательских перехваченных исключений в Crashlytics Android SDK, но не могу найти ничего подобного для iOS SDK. Есть ли способ зарегистрировать перехваченное исключение с помощью Crashlytics на iOS?

См. объяснение Android: http://support.crashlytics.com/knowledgebase/articles/202805-logging-caught-exceptions


person Magnus    schedule 16.04.2014    source источник
comment
Это было бы полезно. Единственная альтернатива, которую я вижу прямо сейчас (чтобы получить отчет о сбое / трассировку стека), - это фактически вызвать сбой приложения - с помощью [[Crashlytics sharedInstance] сбой]; что, очевидно, не является идеальным пользовательским опытом. Большинство ошибок приложения, обнаруженных в коде, могут быть более изящно устранены, чем сбой приложения, но все же очень полезно иметь на этом этапе навигационные крошки и трассировку стека.   -  person Brad Thomas    schedule 20.03.2015
comment
Пока это реализуется, вы можете выполнить CLS_LOG (см. docs) для регистрации определенных сообщений, они будут добавлены при следующем сбое.   -  person vrwim    schedule 12.05.2015
comment
Вы не знаете, реализовано ли оно еще?   -  person Shobhit Puri    schedule 07.08.2015
comment
Используя recordError, я написал свой собственный глобальный recordException для блоков try/catch, которые, как я знаю, не будут фатальными.   -  person Jacksonkr    schedule 28.08.2017


Ответы (5)


Майк из Crashlytics и Fabric здесь.

Теперь вы можете записывать зарегистрированные ошибки NSError в приложении для iOS, tvOS или OS X. Вы хотите использовать:

[CrashlyticsKit recordError:error];

or

Crashlytics.sharedInstance().recordError(error)

Это позволит вам зафиксировать достаточное количество зарегистрированных ошибок NSError на сеанс пользователя. Они отправляются только при перезапуске приложения. Ошибки в журнале ошибок группируются по домену ошибки и коду. Это означает, что проблемы с ошибками могут охватывать множество различных мест вызова.

См. документацию.

person Mike Bonnell    schedule 12.01.2016
comment
Что, если я хочу зарегистрировать пойманное NSException, а не NSError? - person davis; 31.03.2016
comment
@davis Мы не предлагаем средства для ведения журнала или записи экземпляров NSException напрямую. Вообще говоря, API Cocoa и Cocoa Touch не защищены от исключений. Это означает, что использование @catch может иметь очень серьезные непреднамеренные побочные эффекты в вашем процессе, даже если использовать его с особой осторожностью. Мы рекомендуем никогда не использовать операторы @catch в своем коде. Из документов Apple: фреймворки Cocoa, как правило, не защищены от исключений. Общая схема заключается в том, что исключения зарезервированы только для ошибок программиста, и программа, перехватившая такое исключение, должна вскоре после этого завершить работу. - person Mike Bonnell; 31.03.2016
comment
Кажется, что на веб-сайте Fabric можно увидеть только значение в NSLocalizedDescriptionKey, но может быть и другая полезная информация в других ключах. Я могу сгенерировать свою собственную ошибку и поместить все в NSLocalizedDescription, но это... пахнет - person Oleksii Nezhyborets; 17.08.2016
comment
Нашел тему для моего собственного вопроса выше: twittercommunity.com/t / - person Oleksii Nezhyborets; 18.08.2016
comment
@MikeBonnell Что делать, если пользователь больше не открывает приложение? Все локально зарегистрированные NSErrors никогда не будут отправлены на серверы crashlytics? Если это так, и эти локально зарегистрированные ошибки важны для решения проблем, следует ли регистрировать NSErrors как события ответа? Просьба уточнить. - person geekoraul; 24.05.2017
comment
Это правильно. Если пользователь никогда не перезапустит приложение, NSErrors не будет отправлено. Мы обнаружили, что для большинства приложений это не проблема. События ответов будут иметь больше шансов быть отправленными, но будут содержать меньше информации. - person Mike Bonnell; 24.05.2017
comment
Это сэкономит ваше время Crashlytics.sharedInstance().recordError(error as NSError, withAdditionalUserInfo: ["User_Id":0,"User_Name":"ABC","User_Email":"[email protected]","User_Contact":"789797"]) - person Urvish Modi; 31.05.2017
comment
Нам не нужно ловить исключения, достаточно NSSetUncaughtExceptionHandler в appDelegate, хотелось бы удобный способ использовать его с крашлитиками вот и все. - person thibaut noah; 23.10.2017
comment
@thibautnoah Извините, я не понимаю, что вы ищете, не могли бы вы поделиться еще немного? - person Mike Bonnell; 24.10.2017
comment
@MikeBonnell в основном что-то вроде этого Crashlytics.sharedInstance().recordException(исключение) - person thibaut noah; 24.10.2017
comment
Взгляните на Crashlytics.h и, в частности, на записьCustomExceptionName. - person Mike Bonnell; 24.10.2017

Наконец-то Crashlytics добавили нужную функцию 3.5.0!!

[CrashlyticsKit recordError:error];

or

Crashlytics.sharedInstance().recordError(error)

Справка

/**
 *
 * This allows you to record a non-fatal event, described by an NSError object. These events will be grouped and
 * displayed similarly to crashes. Keep in mind that this method can be expensive. Also, the total number of
 * NSErrors that can be recorded during your app's life-cycle is limited by a fixed-size circular buffer. If the
 * buffer is overrun, the oldest data is dropped. Errors are relayed to Crashlytics on a subsequent launch
 * of your application.
 *
 * You can also use the -recordError:withAdditionalUserInfo: to include additional context not represented
 * by the NSError instance itself.
 *
 **/
- (void)recordError:(NSError *)error;
- (void)recordError:(NSError *)error withAdditionalUserInfo:(nullable CLS_GENERIC_NSDICTIONARY(NSString *, id) *)userInfo;

https://docs.fabric.io/ios/changelog.html#january-7-2016


ИСТОРИЯ

На самом деле это работает не так, как я ожидал: сообщение сохраняется в Crashlytics, но только после перезапуска приложения, и оно сохраняет только последнее сообщение.

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


Вы можете использовать это для регистрации любого исключения

[[Crashlytics sharedInstance] recordCustomExceptionName:@"HandledException" reason:@"Some reason" frameArray:@[]];

В Crashlytics вы увидите его в отчете о сбое, но с типом NON-FATALS.

Событие, если оно не предназначено, исключения использования регистрируются так же, как и исключения, обрабатываемые Android.

Это доступно в версии 3.0.7.

recordCustomExceptionName:reason:frameArray:

Этот метод можно использовать для записи в отчет одной структуры исключений. Это особенно полезно, когда ваш код взаимодействует с неродными языками, такими как Lua, C# или Javascript. Этот вызов может быть дорогостоящим, и его следует использовать только незадолго до завершения процесса. Этот API не предназначен для регистрации объектов NSException. Все NSExceptions, о которых можно безопасно сообщать, автоматически перехватываются Crashlytics.

https://docs.fabric.io/appledocs/Crashlytics/Classes/Crashlytics.html#//api/name/recordCustomExceptionName:reason:frameArray:

person 7ynk3r    schedule 13.10.2015
comment
Удалось ли вам использовать пользовательский тип массива? Не могу понять что туда вставить - person thibaut noah; 23.10.2017

Невозможно зарегистрировать перехваченное исключение в iOS с помощью Crashlytics SDK. CLS_LOG можно использовать для регистрации пользовательских сообщений, но эти сообщения журнала будут отправляться в Crashlytics только с данными о следующем сбое. Если сбоя нет, эти сообщения журнала никогда не попадут на панель инструментов Crashlytics. Я получил официальное подтверждение от службы поддержки Crashlytics по этому поводу. Регистрация перехваченных исключений в iOS есть в их дорожной карте.

person Sinu Varghese    schedule 13.05.2015

Я просмотрел разные сайты, чтобы эта функциональность поддерживалась альтернативой IOS для Crashlytics.

Я обнаружил, что криттерцизм пока что лучший..@Дима, я думаю, что это альтернатива Crashlytics..попробуй.

Вот несколько полезных ссылок, которые помогут интегрировать криттерцизм в ваш проект...!

http://docs.crittercism.com/ios/ios.html#logging-handled-exceptions

http://www.raywenderlich.com/34050/overview-of-ios-crash-reporting-tools-part-2

@try {

     } 
@catch (NSException *exc) 
     {
        [Crittercism logHandledException:exc]
    }

Перейдите по этим ссылкам и посмотрите, полезно вам это или нет...!

person Vidhyanand    schedule 12.05.2015

Используйте строки ниже в блоке catch для обработки пользовательского перехваченного исключения.

NSUncaughtExceptionHandler *handler = NSGetUncaughtExceptionHandler();
handler(exception);

как описано для iOS http://support.crashlytics.com/knowledgebase/articles/222764-can-i-use-a-custom-exception-handler

person Aanabidden    schedule 12.05.2015
comment
Не могли бы вы предоставить полный код с вызовом API. Пожалуйста, рассмотрите следующую ситуацию. @try { // строки кода, которые могут вызвать исключение } @catch (NSException *exception) { NSLog(@%@, exception.reason); // отчет в Crashlytics } - person Sinu Varghese; 12.05.2015
comment
@SinuVarghese блок try-catch для создания отчетов может выглядеть следующим образом: @try { // строки кода } @catch (NSException *exception) { NSUncaughtExceptionHandler *handler = NSGetUncaughtExceptionHandler(); обработчик(исключение); } - person Aanabidden; 12.05.2015
comment
приведенный выше код просто сохраняет исключение в обработчике. Но я хочу «увидеть пойманное исключение на панели инструментов Crashlytics». - person Sinu Varghese; 12.05.2015
comment
@SinuVarghese нет, исключение не сохраняется, оно передается обработчику исключений по умолчанию, который мы установили как аварийную аналитику в методе запуска. - person Aanabidden; 15.05.2015
comment
Я пробовал этот подход, но обработчик всегда был нулевым. Кому-нибудь с ним повезло? - person markdb314; 24.07.2015
comment
@ markdb314, тогда crashlytics может быть не инициализирован. Потому что обработчик не показывает nil в моем коде. - person Aanabidden; 04.08.2015