2016-11-06 3 views
1

В iOS 10 Apple внесла изменения, которые вывод NSLog() не распространяется в распределенных приложениях (предприятие, магазин приложений).Нет вывода NSLog в распределенном приложении под iOS 10

Обратите внимание, что при работе с Xcode NSLog() работает нормально.

Есть ли способ принудительно отлаживать все приложения (очень полезно на этапе бета-тестирования)?

Некоторые подсказки появляются здесь: NSLog on devices in iOS 10/Xcode 8 seems to truncate? Why?

Однако, мы можем иметь четкую реализацию для этого?

ответ

0

Наше решение зависит от двух вопросов:

  1. ли мы компилирования с помощью Xcode 8 и выше? Если да, то новый os_log распознается. Если нет, мы должны вернуться к существующему поведению NSLog.
  2. Мы работаем под управлением iOS-10 и выше? Если да, мы можем использовать новый регистратор. Если нет, мы должны вернуться к существующему поведению NSLog.

Мы найдем ответ на вопрос [1] во время компиляции. Для [2] мы должны тестировать во время выполнения.

Вот реализация:

mylog.h

//only used to force its +load() on app initialization 
@interface MyLog:NSObject 
@end 

#if !__has_builtin(__builtin_os_log_format) 
    //pre Xcode 8. use NSLog 
#else 
    //we need this include: 
    #import <os/log.h> 
#endif 

void myLog(NSString *format, ...); 

#ifdef DEBUG 
    #define NSLog(f, ...) myLog(f, ## __VA_ARGS__) 
#else 
    #define NSLog(f, ...) (void)0 
#endif 

mylog.m

@implementation MyLog 

BOOL g_useNewLogger = NO; 

+(void)load 
{ 
    NSOperatingSystemVersion os_ver = [[NSProcessInfo processInfo] operatingSystemVersion]; 
    if (os_ver.majorVersion >= 10) { 
     g_useNewLogger = YES; 
    } 
    NSLog(@"Use new logger: %@", g_useNewLogger? @"YES":@"NO"); 
} 
@end 

void myLog(NSString *format, ...) 
{ 
    va_list args; 
    va_start(args, format); 
#if !__has_builtin(__builtin_os_log_format) 
    //pre Xcode 8. use NSLog 
    NSLogv(format, args); 
#else 
    //Xcode 8 and up 
    if (g_useNewLogger) { // >= iOS 10 
     NSString *nsstr = [[NSString alloc] initWithFormat:format arguments:args]; 
     os_log(OS_LOG_DEFAULT, "%{public}s", [nsstr cStringUsingEncoding:NSUTF8StringEncoding]); 
    } else { // < iOS 10 
     NSLogv(format, args); 
    } 
#endif 
    va_end(args); 
} 
0

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

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

Смежные вопросы