简单记述一下多环境配置。
第一:多Target
可以配置不同的AppIcon,不同的launchImage(xcode11之后暂时没找到怎么配),不同的build文件,不同的BundleId,DisplayName等等。可以配置不同的Buid Setting, Build Phases和不同的Info.plist。
选择Duplicate之后,会生成一个新的Target,**与此同时会生成一个新的Info.plist文件**。为了方便可以把新生成的Target和plist文件修改成自己想要的名字。然后选中不同的Target进行修改。下面有几个配置相关的小栗子:
1,配置不同的AppIcon:新建AppIcon + 选中Target选中Icon
2,配置不同的自定义变量:在Build Setting里点击加号,选择Add User-Defined Setting添加宏;然后在Info.plist对外开放,在代码中可以获取到该值。
注:
1,这里有个非常重要的点,虽然我们在第一步的时候把新生成的info.plist重命名了,但是这里的代码中必须写**Bundle.main.path(forResource:"Info", ofType:"plist")**这里的名字必须是"Info",不能是重命名后的名字,否则找不到文件。
2,如果用了cocoapods管理工具,那么新建了Target之后,记得修改Podfile文件,这样也可以使两个Target中间产生代码差异。
第二:多scheme
可以同一个Target配置不同的Build环境和参数,本质上是为Target进行服务的,可以搭配多Target模式使用,更灵活!
1,新建scheme,如下图,生成新的scheme
2,配置,Project - Info - Configurations 点击+,配置新的scheme。
按照Target中的操作步骤,可以对自定义宏变量在不同的scheme下配置不同的值。同样通过Info.plist对外公开,Run在不同的scheme配置下,会获取不同的值。
第三:xcconfig文件
多Target和多scheme的情况下,需要对不同的Target和scheme配置,这个配置少了还可以接受,如果多了就会非常麻烦,一次次小心翼翼的检查,还会顾此失彼,让人不快乐。而xcconfig就可以解决这个小问题。
1,新建xcconfig文件
2,工程配置
注:工程采用cocoapods管理之后,会自动生成两个xcconfig文件,如果自己的xcconfig文件是后来建立的,这里默认就选择cocoapods生成的xcconfig文件。如果我们提前创建并配置了xcconfig文件,那执行pod install命令后,大致会出现如下提示:(意思就是,你配,我不配!😂)
既然Pod不配,我们还需要,那我们将cocoapods生成的config文件导入到我们自定义的config文件里面,导入方式就是通过include + 文件路径,导入后,再进行pod install,发现警告消除了。
第四,xcconfig文件的语法:
**每个配置文件都由一系列键值分配组成,Build Setting相关Key值**``**对应字段的缩写**
变量定义,按照OC命名规则,仅由大写字母,数字和下划线(_)组成,原则上大写,也可以不。字符串可以是"也可以是'号。
变量有三种特殊情况:
1,在xcconfig中定义的变量与Build Settings的一致,那么会发生覆盖。可以通过$(inherited),让当前变量继承变量原有值。例如:
OTHER_LDFLAGS = -framework SDWebImage
OTHER_LDFLAGS = $(inherited) -framework AFNetworking
// OTHER_LDFLAGS = -framework SDWebImage -framework AFNetworking
注意⚠️:有部分变量不能通过xcconfig配置到Build Settings中,例如:配置PRODUCT_BUNDLE_IDENTIFIER不起作用。
2,引用变量,$()和${}两种写法都可以:VALUE=value
TEACHER=$(VALUE)-${VALUE}
3,条件变量,根据SDK、Arch和Configration对设置进行条件化,例如:
// 指定`Configration`是`Debug`
// 指定`SDK`是模拟器,还有iphoneos*、macosx*等
// 指定生效架构为`x86_64`
OTHER_LDFLAGS[config=Debug][sdk=iphonesimulator*[arch=x86_64]= $(inherited) -framework "Musheng"
注意⚠️:在Xcode 11.4及以后版本,可以使用default,来指定变量为空时的默认值:
$(BUILD_SETTING_NAME:default=value)