Ответ 1
Вот что мы делаем:
- Пусть iPhone обрабатывает свои собственные аварийные дампы через существующие механизмы App Store. Обновить: если iTunes Connect оказался ненадежным при предоставлении отчетов о сбоях, я начал использовать Crittercism и Rollbar в некоторых моих приложениях. Он хорошо справляется с работой и имеет свободный план.
- Наш выпущенный продукт не имеет никакого следа, это, похоже, согласуется с тем, что делают большинство других приложений для iPhone.
- Если сообщается об ошибке, мы воспроизводим ее с помощью трассированной сборки.
Подробнее:
- Мы определяем макросы для трассировки NSLog на разных уровнях детализации.
- Используйте настройки сборки Xcode для изменения уровня трассировки, который контролирует, как трассировка компилируется в продукт, например. существуют конфигурации сборки Release и Debug.
- Если уровень трассировки не определен, мы показываем полную трассировку в Симуляторе, а при работе на реальном устройстве нет следов.
Я привел пример кода ниже, который показывает, как мы это написали, и как выглядит результат.
Мы определяем несколько разных уровней трассировки, чтобы разработчики могли определить, какие линии трассировки важны, и могут отфильтровывать детали нижнего уровня, если они этого захотят.
Пример кода:
- (void)myMethod:(NSObject *)xiObj
{
TRC_ENTRY;
TRC_DBG(@"Boring low level stuff");
TRC_NRM(@"Higher level trace for more important info");
TRC_ALT(@"Really important trace, something bad is happening");
TRC_ERR(@"Error, this indicates a coding bug or unexpected condition");
TRC_EXIT;
}
Пример вывода трассировки:
2009-09-11 14:22:48.051 MyApp[3122:207] ENTRY:+[MyClass myMethod:]
2009-09-11 14:22:48.063 MyApp[3122:207] DEBUG:+[MyClass myMethod:]:Boring low level stuff
2009-09-11 14:22:48.063 MyApp[3122:207] NORMAL:+[MyClass myMethod:]:Higher level trace for more important info
2009-09-11 14:22:48.063 MyApp[3122:207] ALERT:+[MyClass myMethod:]:Really important trace, something bad is happening
2009-09-11 14:22:48.063 MyApp[3122:207] ERROR:+[MyClass myMethod:]:Error, this indicates a coding bug or unexpected condition
2009-09-11 14:22:48.073 MyApp[3122:207] EXIT:+[MyClass myMethod:]
Наши определения трассировки:
#ifndef TRC_LEVEL
#if TARGET_IPHONE_SIMULATOR != 0
#define TRC_LEVEL 0
#else
#define TRC_LEVEL 5
#endif
#endif
/*****************************************************************************/
/* Entry/exit trace macros */
/*****************************************************************************/
#if TRC_LEVEL == 0
#define TRC_ENTRY NSLog(@"ENTRY: %s:%d:", __PRETTY_FUNCTION__,__LINE__);
#define TRC_EXIT NSLog(@"EXIT: %s:%d:", __PRETTY_FUNCTION__,__LINE__);
#else
#define TRC_ENTRY
#define TRC_EXIT
#endif
/*****************************************************************************/
/* Debug trace macros */
/*****************************************************************************/
#if (TRC_LEVEL <= 1)
#define TRC_DBG(A, ...) NSLog(@"DEBUG: %s:%d:%@", __PRETTY_FUNCTION__,__LINE__,[NSString stringWithFormat:A, ## __VA_ARGS__]);
#else
#define TRC_DBG(A, ...)
#endif
#if (TRC_LEVEL <= 2)
#define TRC_NRM(A, ...) NSLog(@"NORMAL:%s:%d:%@", __PRETTY_FUNCTION__,__LINE__,[NSString stringWithFormat:A, ## __VA_ARGS__]);
#else
#define TRC_NRM(A, ...)
#endif
#if (TRC_LEVEL <= 3)
#define TRC_ALT(A, ...) NSLog(@"ALERT: %s:%d:%@", __PRETTY_FUNCTION__,__LINE__,[NSString stringWithFormat:A, ## __VA_ARGS__]);
#else
#define TRC_ALT(A, ...)
#endif
#if (TRC_LEVEL <= 4)
#define TRC_ERR(A, ...) NSLog(@"ERROR: %s:%d:%@", __PRETTY_FUNCTION__,__LINE__,[NSString stringWithFormat:A, ## __VA_ARGS__]);
#else
#define TRC_ERR(A, ...)
#endif
Настройки Xcode:
В настройках сборки Xcode выберите "Добавить пользовательские настройки" (щелкнув маленькую шестерню в левом нижнем углу экрана конфигурации сборки), затем определите новый параметр с именем GCC_PREPROCESSOR_DEFINITIONS
и присвойте ему значение TRC_LEVEL=0
.
Единственная тонкость заключается в том, что Xcode не знает, как сделать чистую сборку, если вы измените этот параметр, поэтому не забудьте вручную очистить, если вы его измените.