Сборка журнала сбоев iOS, информация об отладке. Сбор и отправка по электронной почте команде разработчиков

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

Есть идеи? Вот снова вопросы. 1) Найдите журнал отладки на устройстве. 2) Откройте файл и прикрепите содержимое файла в виде встроенного текста к почте. 3) Разрешить пользователю отправлять его по электронной почте при следующем запуске приложения.

Спасибо,

9 ответов

Решение

Спасибо за все вклады, ребята. Я объединил ваши решения в одно решение, которое решило бы мою проблему. Вот то, что я сделал, чтобы это было.. Конечно, я не скомпилировал код, это наполовину испеченный код..., но я буду железо это скоро однажды, как я реализую это в моем коде..

NSLog в файл Как NSLog в файл LOG2FILE

#if TARGET_IPHONE_SIMULATOR == 0    
    NSArray *paths =  
    NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);        
    NSString *documentsDirectory = [paths objectAtIndex:0];    
    NSString *logPath = [documentsDirectory stringByAppendingPathComponent:@"console.log"];    
    freopen([logPath cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr);
#endif

Catch Crash и записать их тоже в файл

Сначала создайте функцию, которая будет обрабатывать ошибку и выводить ее на консоль (а также все, что вы хотите с ней сделать):

void uncaughtExceptionHandler(NSException *exception) {    
    NSLog(@"CRASH: %@", exception);      
    NSLog(@"Stack Trace: %@", [exception callStackSymbols]);    
    // Internal error reporting
}

Затем добавьте обработчик исключений в ваш делегат приложения:

-(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:  
(NSDictionary*)launchOptions
{   
    NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);    // Normal launch stuff
}

Установите переменную в info.plist с именем Crashed, а затем прочитайте / запишите ее таким образом

- (void)readPlist
 {
      NSString *localizedPath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"plist"];        
      NSMutableDictionary* plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:localizedPath];

    NSString *crashed;
    crashed = [plistDict objectForKey:@"Crashed"];
}


- (void)writeToPlist
{
    NSMutableDictionary* plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];

    [plistDict setValue:@"YES" forKey:@"Crashed"];
    [plistDict writeToFile:filePath atomically: YES];
}

Как только приложение запустится, прочитайте info.plist и предложите пользователю отправить журналы сбоев.

{
    MFMailComposeViewController *mailComposer = [[MFMailComposeViewController alloc] init];
    mailComposer.mailComposeDelegate = self;[mailComposer setSubject:@"Crash Log"];
    // Set up recipients
    NSArray *toRecipients = [NSArray arrayWithObject:@"first@example.com"]; 
    [mailComposer setToRecipients:toRecipients];
    // Attach the Crash Log..
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *logPath = [documentsDirectory stringByAppendingPathComponent:@"console.log"];
    NSData *myData = [NSData dataWithContentsOfFile:logPath];
    [mailComposer addAttachmentData:myData mimeType:@"Text/XML" fileName:@"Console.log"];
    // Fill out the email body text
    NSString *emailBody = @"Crash Log";
    [mailComposer setMessageBody:emailBody isHTML:NO];
    [self presentModalViewController:mailComposer animated:YES];
}
  1. Для регистрации ваших собственных данных используйте Cocoalumberjack. Это намного быстрее, чем NSLog и может быть включено / выключено динамически. Он также предоставляет опции для сохранения данных в файл. NSLog замедлит ваше приложение и заполнит журнал консоли. Кроме того, вы не хотите, чтобы войти слишком много в целом. Вы не можете безопасно делать запись, когда происходит сбой. Поэтому, как только вы выяснили, где находится проблемная область, добавьте туда еще логи и попытайтесь воспроизвести их, например, с помощью автоматизированных сред тестирования, таких как KIF.

  2. Чтобы поймать отчет о сбое, вам не нужно ничего, кроме решения, основанного на платформе с открытым исходным кодом PLCrashReporter, которая может безопасно отлавливать сбои, даже когда ваше приложение уже находится в магазине приложений! Не рекомендуется ловить исключения, как это предлагают другие, проверьте эту статью, чтобы понять почему!

    iTunes Connect также предлагает вам просмотреть некоторые отчеты о сбоях, но некоторые из них могут занять до 2 недель, но далеко не все, как указано, например, разработчиками Camera+. Поэтому вам лучше использовать собственное решение.

    PLCrashReporter отправит вам стандартные отчеты о сбоях в формате Apple, готовые к символизации, чтобы вы знали, где происходит сбой в вашем коде, включая номера строк.

    Некоторые решения, основанные на PLCrashReporter:

    • QuincyKit: клиент с открытым исходным кодом + сервер php, базовая группировка аварий, символизация может быть автоматизирована с вашего компьютера Mac (я являюсь разработчиком этого)
    • HockeyApp: Платный сервис, использует клиент QuincyKit, расширенная группировка сбоев, символизация полностью выполнена на сервере (я один из разработчиков этого)
    • Bugsense: бесплатный сервис, без символов
    • AppBlade: БЕСПЛАТНЫЙ сервис, если используется с 25 устройствами или менее, без символов
    • http://crashlytics.com/: частная бета-версия, неизвестные функции, похоже, что их решение основано на PLCrashReporter
  3. Предлагаемые решения позволяют либо отправлять данные автоматически при следующем запуске, либо запрашивать у пользователя согласие на отправку.

Для ведения журналов и аналитики в Swift вы можете использовать SwiftyBeaver, это полнофункциональная платформа ведения журналов, включающая в себя Swift 2 & Objective-C Framework с открытым исходным кодом, зашифрованное облачное хранилище и приложение Mac.

Веб-сайт: https://swiftybeaver.com/

Framework (поддерживающий): https://github.com/SwiftyBeaver/SwiftyBeaver

Отказ от ответственности: я основатель.

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

Из другого SO вопрос о Xcode 4.2, всегда возвращающемся к основному в случае сбоя. Ответ там использует этот метод, и вы можете расширить его, чтобы отслеживать сбои.

реализовать свой собственный обработчик исключений в AppDelegate

// on load
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);

void uncaughtExceptionHandler(NSException *exception) {
    NSLog(@"CRASH: %@", exception);
    NSLog(@"Stack Trace: %@", [exception callStackSymbols]);
    // Internal error reporting
}

ОБНОВЛЕНИЕ Я сделал некоторый откат назад, и это решение было предложено Зейном Клэйсом к вопросу, отладка Xcode 4.2 не символизирует вызов стека

Он предлагает общее решение в своем втором комментарии. "Я считаю полезным записать журнал сбоев в файл и предложить пользователю отправить его при следующем запуске (только в режиме выпуска, чтобы не мешать отладке). Это позволяет мне получать отличные отчеты об ошибках.... и пользователи знают, что их проблема решается "Я понимаю, что не все хотели бы спросить об этом пользователя, но есть супер-пользователи, которые были бы рады помочь.

Вы, конечно, могли бы включить кнопку "никогда не показывать мне это приглашение снова", чтобы люди не разочаровывались механизмом отчетности.

В качестве альтернативы, вы можете обратиться к серверу с информацией (не уверен, будет ли он работать, так как он аварийно завершает работу, но сохраните его и иногда пытайтесь отправить POST на сервер с подробной информацией)

Я использовал Crittercism, чтобы автоматизировать это для меня. Работает для тестирования и в производстве тоже.

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

Я думаю, что это лучше, чем электронная почта, потому что, когда ваше приложение станет популярным, вам нужно будет управлять всеми этими электронными письмами вручную, в то время как BugSense делает это автоматически. Тем не менее, BugSense также с открытым исходным кодом, так что вы можете изменять его внутренние компоненты любым удобным для вас способом и добавлять любые дополнительные функции.

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

Отказ от ответственности: я пишу код для BugSense-iOS.framework.

См. Ответ Райана в разделе Как просмотреть заявление NSLog из файла.app для iphone для бесплатной утилиты, предоставляемой Apple.

Но это все еще не удобное решение. Если вы можете позволить себе новую сборку, вы должны изменить логирование в приложении. У Яно есть несколько очень хороших идей по этому вопросу в разделе Как загрузить журнал в файл. Особенно вариант 2 должен обходиться без особых усилий.

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

Если вы используете TestFlight с их SDK, это будет автоматизировано. Это действительно хорошая система. Однако только для тестовых сборок.

https://testflightapp.com/sdk/

Я использовал код ниже, чтобы поймать журналы отладки - Swift 4.1

var paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
let documentsDirectory = paths[0]
let fileName = "Logfile.txt"
let logFilePath = (documentsDirectory as NSString).appendingPathComponent(fileName)
freopen(logFilePath.cString(using: String.Encoding.ascii)!, "a+", stderr)
Другие вопросы по тегам