对于很多大牛来说,使用Build Configuration配置多环境是so easy,但是小白我最近刚用到项目里面,准备记录一下。有不合适的地方,还希望能多多指教。
我主要是从这篇文章(https://blog.csdn.net/khlljm/article/details/52293649)学习的,感谢一下作者,我按照自己的理解,改进了一下理解顺序。
多环境配置可以使用Build Configuration,xcconfig文件,Targets。今天记录的是第一种--利用Build Configuration配置多环境,把发布到appstore的环境和测试、开发环境分开。
一.新增Configation
在Project--》Info里面我们找到configations。里面已经默认有Debug和Release两个配置了。我们点击+号,Duplicate"Release"Configuration,取名AdHoc。因为原来的Debug我们用来开发时候用,Release用来发布到appstore时用,新增一个用于给测试使用。Release编译时有做编译优化,和发布到appstore时候给用户用的效果最接近。
如果使用了cocopods,需要pod update一下。pods下面会新增一个对应的adhoc.xcconfig:
二.如何为不同的Configuration设置对应的请求路径、Appkey等
我们在开发中经常遇到开发环境和测试环境、线上环境的请求路径不一致。但是我们总不能每次切换环境的时候,手动注释代码切换环境。我们可以使用如下的小方法:
1.新增宏定义
在Bulid Setting--》Preprocessor Macors下面新增宏定义。Preprocessor Macors下面AdHoc、Debug、Release每行后面对应的可以加上宏定义,在对应的环境里面使用。
我们在Adhoc下新增宏定义AdHoc=1:
2.使用宏定义为不同环境设置请求url
我们在前面设置了宏定义值,在对应的环境里面取到对应的宏定义值的时候,就去执行对应的代码:
三.如何为不同的Configuration设置对应的App名称/App icon——User-defined Build Settings
使用完宏定义在代码里面配置相关信息后,我们看看如何配置app名称。在Build settings里面,点击+号---》Add User-Defined Setting,增加一个自定义属性,取名CustomAppName,用于存放不同环境里面app的名称。
修改info.plist里面,把读取的名称修改为刚刚设置的CustomAppName:
appicon和appname不同的区别是,不需要新增User-Defined Setting,Bulid Settings--》Asset Catalog App Icon Set Name里面设置对应的appicon即可:
四.如何为不同的Configuration设置对应的Bundle id——PRODUCT_BUNDLE_IDENTIFIER
既然有不同的环境,我们也会有不同的Bundle id。Bulid Settings--》Product Bundle Indentifier。给对应的环境设置对应的Bundle id即可。
给对应的bundle id选择对应的证书,这样真机调试的时候才不会报错。
打包时候的证书,这里可以不选正确,xcode会在打包时自动选择bundlid对应的证书:
五.运用Scheme
前面讲了不同环境下怎么设置请求地址、名称、证书等,现在我们来看怎么切换不同环境运行。
如下图,我是按照下图配置scheme的。
因为在xcode里面。真机/模拟器运行的时候,会执行Run模式下的configation配置;打包的时候会执行Archive模式下的配置。
选择两个里面的任何一个scheme,真机/模拟器就去执行Debug,就是开发环境。
打包给测试的时候,选择scheme1,打出包来就是Archive模式下的Adhoc,就是前面配置的测试环境。
发布到app store的时候,选择scheme2,打出包来就是Archive模式下的Release,就是前面配置的线上环境。
下面我们看如何完成:
1.新增scheme
选中已有的scheme,复制一份;
2.修改scheme名称为scheme1,用于平时真机测试、打包提测。Run模式下选择Debug、Archive模式下选择AdHoc。
3.原来自带的scheme就不变。用于上传app store。Run模式下选择Debug、Archive模式下选择Release。
4.把两个sheme的shared都点击上。让其他小伙伴也能看到新增的scheme。
5.运行、打包,即可看到想要的效果。
六.踩过的坑
1.坑1:为不同的Configuration设置Bundle id使用User-defined Build Settings属性就好。不需要自定义User-defined Build Settings。为什么呢?
我看到有的文章设置bundle id的时候User-defined Build Settings属性。这样每次切换环境的时候,都需要clean,然后再运行,才会识别为新的bundlId。而且真机运行的时候会遇到各种问题。
使用Bulid Settings--》Product Bundle Indentifier来设置不同环境下的bunld id。不需要clean,xcode就会识别为新的bundleid了。
------------------------------------------------------
意思就是,在Build settings--》User-defined Build Settings,新增AppBundleId,再在info.plist里面对应的Bundle Id。选择scheme1,Run模式下设置为debug,此时的General里面的bundleid为 debug对应的com.configuration.debug。
如果把scheme1的Run模式改为AdHoc,使用scheme1运行。General里面的Bundle id应该为com.configuration.test,对吧?但是,我们看,他其实还是com.configuration.debug
我clean了一下,点击build settings,再切换回General刷新了一下,发现Bundleid终于变成
com.configuration.test了。
你认为clean一下就没问题了吗,no no no,真机运行的时候,会发现又报错说证书和Product Bundle Indentifier不一样了。。好吧。。我们最后还是要去改Product Bundle Indentifier。。还不如直接用系统原本设定的Product Bundle Indentifier来控制Bundleid呢。。。
2.坑2:Preprocessor Macros里面的Release设置的宏定义名称不能叫Release/release。不然使用Release打包的时候会失败。
坑是这么来的,我在Release下面设置了一个宏定义名称为Release,模拟器运行成功了。
scheme选择ConfigurationTest,ConfigurationTest的Archive模式对应的是Release,打包就报错了。很多文件都被爆有问题。
把Release修改为非Release/release任何一个宏定义,就打包成功了。不然使用release打包的时候无法成功。
好啦。就这么多了。这次除了学习使用configation配置多环境以外,发现所有的内容,真正实际去操作了才会发现问题所在。如果我有理解不到位的地方,还希望大家多多指教!