在iOS 10下的分布式应用程序中没有NSLog输出

时间:2016-11-06 15:23:48

标签: ios ios10 nslog

iOS 10 中,Apple已对分布式应用程序(企业版,应用商店版)中未发出NSLog()输出进行了更改。

请注意,从Xcode运行时,NSLog()工作正常。

有没有办法强制调试所有应用程序(在beta测试阶段非常有用)?

此处显示了一些线索:NSLog on devices in iOS 10 / Xcode 8 seems to truncate? Why?

但是,我们可以为此明确实施吗?

2 个答案:

答案 0 :(得分:0)

我们的解决方案取决于两个问题:

  1. 我们是否正在使用Xcode 8进行编译?如果是,则识别新的os_log。如果没有,我们必须回退到现有的NSLog行为。
  2. 我们是否在iOS-10下运行?如果是,我们可以使用新的记录器。如果没有,我们必须回退到现有的NSLog行为。
  3. 我们将在编译时找到问题[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);
    }
    

答案 1 :(得分:0)

如果您想要一个插入式解决方案来获取应用的日志,我建议您查看我们创建的工具。它被称为Bugfender,它的作用是将所有应用程序日志发送到我们的服务器,以便您可以在我们的网站上查看它们。

在进行beta测试时非常有用,因为您的用户可以测试应用,如果他们发现问题,您将获得他们在应用中完成的所有信息。