KZBootstrap简介
最近在项目中集成了KZBootstrap,它的简介是"iOS project bootstrap aimed at high quality coding."。主要特色是:
-
Icon Version
Code Quality and Warnings
加入了一些编译设置-
一些有用的宏
环境变量设置
可以在系统设置中切换app的环境设置,方便app处理例如QA/生产等不同环境下的逻辑。另外还有可选的log和debug增强支持。
集成说明
KZBootstrap有两种集成方式:
1.手动集成;
2.使用作者提供的另一个Xcode项目配置工具crafter
我试用了一下crafter,发现有一些配置在Xcode 7上似乎没有生效。同时手动的方式对结果更可控一些。本文只说明手动集成方法。
目标
- 集成KZBootstrap。
- 配置Xcode使用3种configuration: Debug, Adhoc, Release。
其中Debug使用一个bundle id(com.xxx.xxx.dev
),Adhoc和Release使用另一个bundle id(com.xxx.xxx
)。这个是我的个人原因。因为在使用友盟消息推送,他家后台同一个APP只支持设置开发和生产两个推送证书,不同的bundle id对应的推送证书是不同的。
另外,微信和QQ在注册应用支持时都是靠bundle id识别的,Adhoc和Release设置成同一个bundle id方便测试人员进行测试,能够尽可能的保证线上发布与Adhoc发布的一致性。 - APP可以有一个运行时的环境变量设置,Debug/Adhoc下可以在系统设置中进行改变。在Release时不会出现这个设置选项。
这样在APP的代码逻辑里可以根据环境变量执行不同的分支。 - 支持icon version。
手动集成(参照项目官方指南)
- 先在apple的member center里生成一个新的证书及相应的provision file。对应的bundle id添加.dev结尾。
例如,原来的应用bundle id为com.xxx.xxx,新bundle id为com.xxx.xxx.dev
- 如果涉及推送请添加好对应的证书。如涉及第三方应用的回调也可以在之后的代码中做相应的识别和注册。
- 在Podfile中添加KZBootstrap,暂时先不执行pod update
pod 'KZBootstrap', '~> 0.6.0'
-
在Xcode中打开项目,在Project信息页Configuration栏选择Duplicate "Release" Configuration,并命名新Configuration为Adhoc
-
将三个configuration的base configuration都设为None
关闭项目,执行
pod update
- 若在添加configuration后不做如上操作,则Cocoapods将不能正确设置项目,在pod update结束时会提示
[!] CocoaPods did not set the base configuration of your project because your project already has a custom config set.
- 在项目中添加KZBEnvironments.plist
用于读取环境配置,文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>KZBEnvironments</key>
<array>
<string>QA</string>
<string>STAGING</string>
<string>PRODUCTION</string>
</array>
</dict>
</plist>
-
在Xcode中选择相应的target,在
Build Settings
中添加User-Defined设置BUNDLE_DISPLAY_NAME_SUFFIX
,用于显示
在应用的plist文件中为Bundle display name添加后缀
${BUNDLE_DISPLAY_NAME_SUFFIX}
- 原来为
appABC
,修改后为appABC${BUNDLE_DISPLAY_NAME_SUFFIX}
- 在
Build Settings
的Packaging
区找到Product Bundle Identifier
,为debug添加后缀.dev
- KZBootstrap本身推荐使用
BUNDLE_ID_SUFFIX
变量来区分,但是我实验时使用这个变量在编译时中Xcode不能正确匹配证书。我猜测原作者用的是wildcard cert所以不会遇到这个问题。
-
在
Build Settings
中添加User-Defined
设置KZBEnv
-
在
Build Settings
的Preprocessing
区修改Preprocessor Macro
,添加KZBEnv=${KZBEnv}
本文不涉及用户自定义macro的使用,所以不添加
KZBootstrapUserMacros.h
文件在项目中添加
Settings.bundle
,New File -> Resource -> Settings Bundle
,修改Root.plist文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>StringsTable</key>
<string>Root</string>
<key>PreferenceSpecifiers</key>
<array>
<dict>
<key>Type</key>
<string>PSGroupSpecifier</string>
<key>Title</key>
<string>Info</string>
</dict>
<dict>
<key>DefaultValue</key>
<string>NoVersion</string>
<key>Key</key>
<string>Version</string>
<key>Title</key>
<string>Version</string>
<key>Type</key>
<string>PSTitleValueSpecifier</string>
</dict>
</array>
</dict>
</plist>
- 如果设置相关的内容在系统设置中没有出现,双击HOME键关闭设置app再打开就可以出现了。(Refer)
- 在target的
Build Phases
中添加Run Script Phase
,设置命令为
"${SRCROOT}/Pods/KZBootstrap/Pod/Assets/Scripts/bootstrap.sh" -t -n -i
脚本共支持5个参数
- -l
开启行数警告(250行以上都会被警告) - -t
开启TODO警告 - -u
开启用户宏 - -n
开启自动build-number - -i
开启icon versioning(开启这一项会同时启用自动build-number)
要支持icon versioning需要在系统中安装imagemagick
和ghostscript
,推荐使用brew
安装
brew install imagemagick
brew install ghostscript
另外,0.6.0版本并不支持@3x图片的icon version,但是最新的master分支上的代码已支持。
- 在AppDelegate中添加处理代码
[[NSUserDefaults standardUserDefaults] setObject:VERSION_APP forKey:@"Version"];
KZBootstrap.defaultBuildEnvironment = KZBEnv;
KZBootstrap.onCurrentEnvironmentChanged = ^(NSString *newEnv, NSString *oldEnv) {
NSLog(@"Changing env from %@ to %@", oldEnv, newEnv);
};
[KZBootstrap ready];
NSLog(@"user variable = %@", [KZBootstrap currentEnvironment]);
NSLog(@"KZBootstrap:\n\tshortVersion: %@\n\tbranch: %@\n\tbuildNumber: %@\n\tenvironment: %@", KZBootstrap.shortVersionString, KZBootstrap.gitBranch, @(KZBootstrap.buildNumber), KZBootstrap.currentEnvironment);
- 配置完成!之后在代码中使用
[KZBootstrap currentEnvironment]
就可以读取当前的环境设置。在Archive时可以选择不同的configuration以打出Adhoc或者是Release包。