美文网首页编译iOS
xcconfig 基本使用与分析

xcconfig 基本使用与分析

作者: 寸光片静 | 来源:发表于2022-03-03 00:59 被阅读0次

    通过文件的形式,管理、替代Build Settings,更方便的管理设置Build Settings。其以Key-Value格式(Build Settings类似shell环境变量),进行编辑。参考官方文档

    创建 -- 后缀名xcconfig
    1. 项目中,command + N 搜索config;
    2. 选择Configuration Settings File;
    3. Next -- 命名文件名称;
    4. Create -- 创建完成;
    5. 配置关联xcconfig文件,使xcconfig生效。

    一个项目中允许有多个xcconfig文件,但只有一个入口,只能配置一个xcconfig文件,其它xcconfig文件被#include到入口文件即可。
    可以给Project、Target配置;如图中步骤4,展开Project,就显示Target,就可以给Target添加配置。

    配置关联xcconfig文件(入口),图中为Debug环境下给Project设置

    语法
    注释 -- “//” 两正斜杠
    1. 单行注释,注释整行;
    2. 也可以在设置值后面;
    3. 与URL中“//”互斥问题。

    图2中:URL与 // 问题解决:如自定义一个正斜杠变量TAG_SLASH,在URL引用TAG_SLASH变量

    “//”实现使用

    变量 -- 以Key=Value的形式

    Key一般以大写字母下划线分割;可以自定义,也可以使用Xcode已定义好的环境变量。

    1. 覆盖变量:变量Key与Xcode一致时。会出现覆盖,如高优先级覆盖低优先级、先执行被后执行覆盖。可以通过${inherited},让当前变量值继承原有值。例如:
    OTHER_LDFLAGS = -framework Masonry 
    OTHER_LDFLAGS = $(inherited) -framework AFNetworking
    // OTHER_LDFLAGS = -framework Masonry -framework AFNetworking
    

    注意:有部分变量不能通过 xcconfig 配置到 Build Settings 中,例如:配置PRODUCT_BUNDLE_IDENTIFIER 不起作⽤。

    获取Xcode定义好的环境变量Key
    1. 引⽤变量: $()${} 两种写法都可以:
    1. 条件变量:对SDK 、 Arch 和 Configration 对设置进⾏条件化
    1 //指定`Configration`是`Debug`
    2 // 指定`SDK`是模拟器,还有iphoneos*、macosx*等 
    3 // 指定⽣效架构为`x86_64`
    OTHER_LDFLAGS[config=Debug][sdk=iphonesimulator*][arch=x86_64]=
    $(inherited) -l AFNetworking
    

    注意:在 Xcode 11.4 及以后版本,可以使⽤ default ,来指定变量为空时的默认值:
    $(BUILD_SETTING_NAME:default=value)

    1. Value类型 常见的有如下:

      • Boolean:YES or NO;
      • string:字符串,指定的文本值;
      • enumeration (string):枚举,预定义的文本值;
      • string list:字符串列表,以空格分隔的字符串值列表。如果字符串列表中的字符串包含空格,则字符串必须用引号括起来;
      • path:路径,POSIX格式的文件或目录路径;
      • path list:路径列表,用空格分隔的路径值列表。如果路径列表中的路径包含空格,则路径必须用引号括起来。
    2. "、'单双引号表示字符串

    双引号、单引号表示字符串

    执行脚本
    • Xcode执行脚本的配置
    脚本的配置;执行Shell语言的echo命令输出设置的xcconfig值 在Xcode的终端输出执行结果

    由于查看脚本结果每次到Xcode终端查看编译记录,Xcode终端和Mac上的终端都是Shell环境,所以把执行的脚本结果重定位到Mac终端上。

    • 重定位
      把Xcode执行Shell语言的结果在Mac终端上输出
      • “1”:获取当前执行shell命令的标准输出(无语法错误的输出);
      • “>”:重定位符;
      • 获取终端标识符:输入“tty”
    获取当前终端的标识符 第五行的执行结果重定位到终端上 在终端输出结果

    链接 .a库
    • 配置头文件 -- 编译.o文件生效
      HEADER_SEARCH_PATHS = ${SRCROOT}/MyXconfig/Libs
    • 库所在目录 -- 符号信息
      LIBRARY_SEARCH_PATHS = ${SRCROOT}/MyXconfig/Libs
    • 链接器连接库 -- 链接器生成可执行文件(需要符号的具体信息,在.a的库里 );“-l”参数:表示库library;多个库用空格。
      OTHER_LDFLAGS = -lAFNetworking -lMasonry
    链接.a库 三步骤
    配置完成头文件

    配置Build Settings优先级

    Target > Target-xcconfig > Project > Project-xcconfig。BuildSettings默认继承 ${inherited}

    • Target 配置Build Settings
    • Target 配置xcconfig文件
    • Project 配置Build Settings
    • Project 配置xcconfig文件
    Target中删除HEADER_SEARCH_PATHS,xcconfig设置失效;或者导入其它库会覆盖xcconfig的值
    • 如果Project和Target都添加了同一个xcconfig文件,此时xcconfig文件属于Target的xcconfig
    • 需要使用关键字${inherited}

    关键字继承 -- ${inherited}、包含/导入 -- #include

    继承 -- ${inherited}
    在不同文件中,存在优先级关系时,同一个key时高优先级会覆盖掉低优先级的value。一般开发中,设置的value是一起存在。所以就需要使用 ${inherited},解决该种问题。存在优先级关系有:

    • 配置Build Settings优先级
    • 多个xcconfig中(例如:a文件引入b文件,此时a的文件比b文件高,其实以内容的执行顺序有关,会直接覆盖之前的内容)
    在Target中添加${inherited},就把xcconfig同一Key值继承过来

    包含/导入 -- #include
    配置多个xcconfig文件,但引入xcconfig的入口只有一个,所以此时需要使用上关键字#include。[注意]:多个xcconfig文件,同一个key会产生覆盖,就需要使用“${inherited}”继承。引用三种方式,如下:

    • 文件名
      • 与当前生成配置文件位于同一文件夹中的生成配置文件的名称;
        # include“MyOtherConfigFile.xcconfig”
    • 相对路径
      • 相对于当前生成配置文件的位置,生成配置文件的路径;或以${SRCROOT}的路径开始;
        # include“. . / MyOtherConfigFile.xcconfig” :当前文件上一层
        # include“ ${SRCROOT} /Test/MyOtherConfigFile.xcconfig”:当前项目根目录下的Test文件夹里
    • 绝对路径
      • 生成配置文件在磁盘上的绝对路径。
        #include "/Users/MyUserName/Desktop/MyOtherConfigFile.xcconfig"

    [注意]:如果在生成时没有找到指定的文件,则会生成生成警告。要消除对丢失构建配置文件的警告,请在#include前缀后加上问号(?)。

    #include? "MyOtherConfigFile.xcconfig"

    • Cocoapods
      项目中使用cocoapods管理,其就有用xcconfig配置Build Settings。而自己添加xcconfig文件时。就把引入xcconfig文件入口选择自己的xcconfig,并在里面#include cocoapods的xcconfig文件路径。



    项目里访问xcconfig值

    目前只能用Info.plist** 打开Info.plist可以访问Build Settings里的变量值。如:Bundle name/identifier等

    1. xcconfig文件自定义变量;
    2. Info.plist文件设置自定义Key,获取变量;
    3. 代码使用,用Info.plist获取。



    扩展
    脚本功能模块保存在项目.xcodeproj(显示包内容)~> project.pbxproj。所以可以使用脚本注入一些信息,想达到的操作。

    相关文章

      网友评论

        本文标题:xcconfig 基本使用与分析

        本文链接:https://www.haomeiwen.com/subject/cmkyrrtx.html