应用场景:在开发app过程中,你肯定需要有测试环境,而测试环境和线上环境的切换如果你是根据修改代码来实现那你就太low了。这时候你会实现一个debug功能模块,不但你能进行环境切换,产品经理,测试员同样能用这功能。而随着产品逐渐成熟,需要的debug功能也会越来越多,如:ABTest切换,用户登录登出,指定页面跳转,日志查看等功能。从另一个方面说你的debug模块代码会越来越多。那么,怎样让debug代码不污染线上app呢?
一般,你可能会想到的是我只需要在每个类或方法上添加上宏的判断就行了,在debug下才会定义某个类或方法,如下:
#if DEBUG
@interface DebugA : UIViewController
// 方法...
@end
#endif
#if DEBUG
@implementation DebugA
// 方法实现...
@end
#endif
#if DEBUG
DebugA *a = [[DebugA alloc] init] ;
// 方法调用...
#endif
上面的方法,看起来是可行的。它保证了只有在 Debug 环境下,才会有 DebugA
类的定义和实现,也保证了只在 Debug 环境下才对 DebugA 进行实例化。
问题: 虽然在 Release 下类和方法是没定义了,但是文件在打包的时候还是会被打包进app, 另外,类的定义和实现都用宏包起来,从一定程度上对代码造成了污染; 另一个问题,如果在实现过程中涉及到图片或者xib的使用,这些文件在 Release 下即使不显示也不使用,但是已经被打包进 app 了。怎么杜绝这两个问题呢?
EXCLUDED_SOURCE_FILE_NAMES 能很好的帮你解决这个问题。从key的名称可以大概知道,它是用来 通过文件名排除资源文件 的。
你只需要在相应的 Target 下的 Build Settings 中添加 User-Defined Setting,然后添加 EXCLUDED_SOURCE_FILE_NAMES,并在不同编译配置下进行文件名的忽略(支持正则匹配)即可。
上图,在 Release 下通过匹配文件名存在 Debug 字样的文件,这样,在 Release 下就会将文件名包含 Debug 的文件忽略了。所以,在定义 debug 功能模块的类和方法上都不需要通过 #if Debug #endif
来污染代码了,同样的,debug 的资源文件也不会被打包进 Release 下的 app 内了。
等等,问题解决了吗