Cлов журнала отказов iOS, информация об отладке. Захват и отправка по электронной почте команде разработчиков - PullRequest
49 голосов
/ 23 ноября 2011

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

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

Спасибо

Ответы [ 9 ]

64 голосов
/ 23 ноября 2011

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

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

Перехват 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];
}
48 голосов
/ 23 ноября 2011
  1. Для регистрации ваших собственных данных используйте Cocoalumberjack . Это намного быстрее, чем NSLog и может быть включено / выключено динамически. Он также предоставляет опции для сохранения данных в файл. NSLog замедлит ваше приложение и заполнит журнал консоли. Кроме того, вы не хотите, чтобы войти слишком много в целом. Вы не можете безопасно делать запись, когда происходит сбой. Поэтому, как только вы выяснили, где находится проблемная область, добавьте туда еще записи и попробуйте воспроизвести ее, например, с помощью автоматизированных сред тестирования, таких как KIF .

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

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

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

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

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

5 голосов
/ 04 апреля 2016

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

Сайт: https://swiftybeaver.com

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

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

4 голосов
/ 23 ноября 2011

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

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

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

// on load
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);

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

UPDATE Я немного откатился назад, и Зейн Клэйс предложил это решение на вопрос Отладка Xcode 4.2 не символизирует вызов стека

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

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

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

3 голосов
/ 23 ноября 2011

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

1 голос
/ 15 декабря 2011

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

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

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

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

0 голосов
/ 20 августа 2018

Я использовал приведенный ниже код для перехвата журналов отладки - 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)
0 голосов
/ 23 ноября 2011

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

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

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

0 голосов
/ 23 ноября 2011

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

https://testflightapp.com/sdk/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...