最近使用build configuration和scheme来配置工程的debug 和release模式,这方面的文章很多,我在此就不再多说可以参考手把手教你给一个 iOS app 配置多个环境变量接下来我主要说下我遇到的坑
首先我们看Telegram工程中包含MtProtoKit SSignalKit等四个依赖工程,在主要的工程里还包含了其他的target
image.png
他原本工程有Debug Hockapp和Debug AppStore,Release AppStore
,Release Hockapp四个configuration,分别对应的是企业版的调试和线上模式和App Store的调试和线上模式。
注意:没有默认的debug 和release模式
在编译的时候,xcode会自动把工程打包成所有其他target打包成静态库,然后会在对应工程的DerivedData里面对应的build->Products-->对应的configuration文件
image.png
- 比如我们在主工程里面建立配置文件叫xxxDebug,但是我们的依赖工程里面没有xxxDebug这个对应的bulidConfiguration 这个时候他会自动打包
command line builds
选项对应的模式
image.png
如果你直接使用你的configuration编译你会发现file not found
错误。
非常庆幸的是在react-native里面也有一样的错误,可以参考issues223。原因就是编译之后再对应的文件夹下没找到framework, 如果这你这时候手动吧对应的framework拷贝到你configuration的文件夹下也是可以运行的
image.png
接下里才是telegram里面最坑的
- 首先在SSignalKit这个依赖工程中也没有默认的Release模式,他的command line build是选择的Release Hockey app 导致SSignalKit这个依赖库打包的framework会在
Release Hockeyapp-iphonesimulator
中(如果是真机最后的后缀是-iPhone)所以你不不仅要添加"$(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)"
还需要添加"$(BUILD_DIR)/Release Hockeyapp$(EFFECTIVE_PLATFORM_NAME)"
- 第二个坑telegram这个工程文件下有其他target,在Library Search Paths没有添加
$(inherited)
添加了这个的意思就是继承当前工程对应的search paths