Подтвердить что ты не робот

IOS crash log catch, debug info.. Поймать и отправить по электронной почте команде Dev

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

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

Спасибо,

4b9b3361

Ответ 1

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

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

Поймайте сбой и запишите их также в файл

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

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:@"[email protected]"]; 
    [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];
}

Ответ 2

  • Для регистрации собственных данных используйте Cocoalumberjack. Это намного быстрее, чем NSLog и может быть включено/выключено динамически. Он также предоставляет опции для сохранения данных в файл. NSLog замедлит ваше приложение и заполнит журнал консоли. Также вы не хотите регистрировать слишком много в целом. Вы не можете безопасно выполнять регистрацию при сбое. Поэтому, как только вы выясните, где находится проблема, добавьте еще несколько журналов и попытайтесь воспроизвести их, например. с помощью автоматизированных систем тестирования, таких как KIF.

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

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

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

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

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

Ответ 3

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

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

Рамка (поддержка): https://github.com/SwiftyBeaver/SwiftyBeaver

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

Ответ 4

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

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

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

// on load
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);

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

UPDATE Я сделал некоторое отступление, и это решение было предложено Zane Claes на вопрос Отладка Xcode 4.2 не символизирует вызов стека

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

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

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

Ответ 5

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

Ответ 6

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

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

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

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

Ответ 7

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

https://testflightapp.com/sdk/

Ответ 8

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

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

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