[toc]
前言
创建一个项目在xcode
中有以下三项,在平时开发不是很大型的项目,很少会注意这些问题。
Xcode配置
-
Project
:包含了项⽬所有的代码,资源⽂件,所有信息 -
Target
:对某些代码和资源文件的构建方式 -
Scheme
:对指定的Targe
的配置
真正打工干事就是target。
多环境管理 一套代码多app管理
开发环境 预发布环境 正式环境使用的地址都是不同的每次打包都需手动切换是很麻烦的一件事,有么有一键配置好所有的内容,打包切换一下target呢?
肯定有解决方案
方案一 Duplicate
- 选择Duplicate,发现项目中多一个
list
文件高级技巧01 copy-Info.plist
- 配置宏
3.项目中使用,定义一个宏,将工程切换到高级技巧01 copy
,打印
这种修改适用于代码改动不大,只是改了一写接口,第三方申请key等都可以在一个地址集中修改,但是这样还是不够方便
方案二 configurations
- 配置
Configuration
的目的是为了增加或删除编译环境
对于不同编译环境下的参数需求可以到xcconfig
中进行设置。 - 以下例子未使用xconfig。
- 增加一个配置Debug_pre
- 在这里修改bundle ID根据项目开发需要
- 设置对应的域名
- info.plist文件设置key去build seting里面对应key所对应的值
- 创建scheme打到多环境,每个scheme对应一个环境
- 在
APPdelegate
配置获取HOSt_URL
的路径,切换scheme
查看打印结果
- debug
- debug_pre
- release
上面方式基本可以满意开发需求,但是针对于pod项目还是需求另一种解决方案。
方案三 Configuration+xcconfig
- 配置xcconfig
xcconfig
文件的修改实际上是修改build setting
中的参数。相关缩写看Xcode.Build Setting 里的关键字含义。
- 现在配置debug和releas环境
命名规范目录+app名称+环境+xcconfig后缀
1.选择文件
2.命名,配置
3.如果使用pod,在执行pod install会报以下错误
[百度的解释,具体博客作者忘记了] 大概意思是你需要你配置的
xcconfig文件
中导入pod配置
文件的路径。在完成一次pod install
之后,Pods
工程会为每一个环境生成一个xcconfig
文件,包括默认的debug
环境,如果我们的目标工程对应的环境没有配置xcconfig
文件,那么就会在当前工程工程下拷贝一份对应的xcconfig
文件并自动在环境中完成配置,这种配置让工程能够使用pod
。
我们只需要在其他xcconfig
文件中导入相关的pod
下的xcconfig
就好了,记得使用相对路径,否则在其他电脑上就不能运行了:
- XXXXXX文件名称
#include "Pods/Target Support Files/XXXXXX.xcconfig"
key也可以知道环境模拟器架构
OTHER_LDFLAGS[config=Debug][sdk=iphonesimulator*][arch=x86_64]=-framework "AFN"
xconfig编写指南
xcconfig
文件的语法比较简单,每个配置文件都由一系列键值分配组成,这些键值分配具有以下语法:
BUILD_SETTING_NAME = value
注释
xcconfig文件只有一种注释方式\。
include导入其他设置
- 在创建
xcconfig
文件的时候,可以根据需求,创建多个。也就意味着,可以通过include
关键字导入其他的xcconfig
内的配置。通过include
关键字后接上双引号:
#include "Debug.xcconfig"
- 在搜索引入的文件时,如果是以/开头,代表绝对路径,例如:
// 表示确切的文件位置
#include "/Volumes/zed/iOS\ dsb/iOS\ 高级技巧\ 练习/高级技巧01/Pods/Target\ Support\ Files/Pods-高级技巧01/Pods-高级技巧01.debug.xcconfig"
- 或者通过相对路径,以${SRCROOT}路径为开始:
#include "Pods/Target Support Files/Pods-LoginApp/Pods-LoginApp.debug.xcconfig"
变量
变量定义,按照OC
命名规则,仅由大写字母,数字和下划线(_)组,原则上大写,也可以不。字符串可以是"也可以是'号。
变量有三种特殊情况:
- 在
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
不起作用。
- 引用变量,
$()
和${}
两种写法都可以:
VALUE=Cat
TEACHER=$(VALUE)-${VALUE}
- 条件变量,根据
SDK、Arch
和Configration
对设置进行条件化,例如:
// 指定`Configration`是`Debug`
// 指定`SDK`是模拟器,还有iphoneos*、macosx*等
// 指定生效架构为`x86_64`
OTHER_LDFLAGS[config=Debug][sdk=iphonesimulator*[arch=x86_64]= $(inherited) -framework "test"
注意⚠️:在Xcode 11.4及以后版本,可以使用default,来指定变量为空时的默认值:
$(BUILD_SETTING_NAME:default=value)
优先级(由高到低)
- 手动配置
Target Build Settings
-
Target
中配置的xcconfig
文件 - 手动配置
Project Build Settings
-
Project
中配置的xcconfig
文件