在 iOS 10 中,Apple已对分布式应用程序(企业版,应用商店版)中未发出NSLog()输出进行了更改。
请注意,从Xcode运行时,NSLog()工作正常。
有没有办法强制调试所有应用程序(在beta测试阶段非常有用)?
此处显示了一些线索:NSLog on devices in iOS 10 / Xcode 8 seems to truncate? Why?
但是,我们可以为此明确实施吗?
答案 0 :(得分:0)
我们的解决方案取决于两个问题:
我们将在编译时找到问题[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测试时非常有用,因为您的用户可以测试应用,如果他们发现问题,您将获得他们在应用中完成的所有信息。