在发布iOS应用程序时删除日志

Rui*_*res 10 nslog maven ios

目前我正在为我的项目构建两个应用程序,一个在发布中,另一个在调试中(唯一改变的是用于签名和端点的配置文件).由于某些策略,我不应该在本地创建ipa文件.所以我使用maven来构建这两个版本(发布和调试),基于脚本.由于相同的策略,应该从应用程序(NSLog,printf ...)中完全删除输出.我知道预处理器宏,但我不想依赖它们,因为某人(不知道)可能会改变它们并危及我想要实现的目标.所以我想要的是:

  1. 当我使用我的模拟器或直接在真实设备上运行时,能够注销我想要的任何东西
  2. 当我使用maven构建我的应用程序时,它将确保NSLogs被剥离或禁用.

Maven依赖于远程存储库中的内容来实际构建,因此如果在远程repo提交期间有一种禁用此日志的方法,那么它也是一个解决方案.

Cod*_*aFi 1

这是一个有趣的请求,但如果您愿意为每个被跳过的日志接受一些函数调用开销,那么这是可行的。EtPanKit 框架内部有一个很好的功能,可以检查尝试调用日志函数的文件是否与文件中的预定义类数组相匹配Info.plist。除了成为一个出色的调试过滤器之外,您在发布时所要做的就是从 plist 中删除所有键,或者在发布版本中指定一个不与该键关联值的不同键LEPLogEnabledFilenames

为了防止链接腐烂,这里是函数本身和相关的宏,使其调用起来更漂亮:

#define LEPLogStack(...) LEPLogInternal(__FILE__, __LINE__, 1, __VA_ARGS__)
#define LEPLog(...) LEPLogInternal(__FILE__, __LINE__, 0, __VA_ARGS__)

#import <Foundation/Foundation.h>
#import <libgen.h>
#import <time.h>
#import <sys/time.h>
#include <execinfo.h>
#include <pthread.h>

static NSSet * enabledFilesSet = nil;
static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

void LEPLogInternal(const char * filename, unsigned int line, int dumpStack, NSString * format, ...)
{
    va_list argp;
    NSString * str;
    NSAutoreleasePool * pool;
    char * filenameCopy;
    char * lastPathComponent;
    struct timeval tv;
    struct tm tm_value;
    //NSDictionary * enabledFilenames;

    pool = [[NSAutoreleasePool alloc] init];

    pthread_mutex_lock(&lock);
    if (enabledFilesSet == nil) {
        enabledFilesSet = [[NSSet alloc] initWithArray:[[NSUserDefaults standardUserDefaults] arrayForKey:LEPLogEnabledFilenames]];
    }
    pthread_mutex_unlock(&lock);

    NSString * fn;
    fn = [[NSFileManager defaultManager] stringWithFileSystemRepresentation:filename length:strlen(filename)];
    fn = [fn lastPathComponent];
    if (![enabledFilesSet containsObject:fn]) {
        [pool release];
        return;
    }

    va_start(argp, format);
    str = [[NSString alloc] initWithFormat:format arguments:argp];
    va_end(argp);

    NSString * outputFileName = [[NSUserDefaults standardUserDefaults] stringForKey:LEPLogOutputFilename];
    static FILE * outputfileStream = NULL;
    if ( ( NULL == outputfileStream ) && outputFileName )
    {
        outputfileStream = fopen( [outputFileName UTF8String], "w+" );
    }

    if ( NULL == outputfileStream )
        outputfileStream = stderr;

    gettimeofday(&tv, NULL);
    localtime_r(&tv.tv_sec, &tm_value);
    fprintf(outputfileStream, "%04u-%02u-%02u %02u:%02u:%02u.%03u ", tm_value.tm_year + 1900, tm_value.tm_mon + 1, tm_value.tm_mday, tm_value.tm_hour, tm_value.tm_min, tm_value.tm_sec, tv.tv_usec / 1000);
    //fprintf(stderr, "%10s ", [[[NSDate date] description] UTF8String]);
    fprintf(outputfileStream, "[%s:%u] ", [[[NSProcessInfo processInfo] processName] UTF8String], [[NSProcessInfo processInfo] processIdentifier]);
    filenameCopy = strdup(filename);
    lastPathComponent = basename(filenameCopy);
    fprintf(outputfileStream, "(%s:%u) ", lastPathComponent, line);
    free(filenameCopy);
    fprintf(outputfileStream, "%s\n", [str UTF8String]);
    [str release];

    if (dumpStack) {
        void * frame[128];
        int frameCount;
        int i;

        frameCount = backtrace(frame, 128);
        for(i = 0 ; i < frameCount ; i ++) {
            fprintf(outputfileStream, "  %p\n", frame[i]);
        }
    }

    if ( outputFileName )
    {
        fflush(outputfileStream);
    }

    [pool release];
}
Run Code Online (Sandbox Code Playgroud)