美文网首页
Xcode Configuration Settings Fil

Xcode Configuration Settings Fil

作者: 西西的一天 | 来源:发表于2020-02-29 19:54 被阅读0次

    自定义xcconfig

    大多数项目都使用了Cocoapods作为依赖管理。当运行完pod install后,Cocoapods会创建xcconfig文件,并将这个配置添导入项目,如下图所示:

    cocoapods xcconfig.png

    那么此时,如果需要自定义Build Configuration,同时保留Cocoapods为我们添加的配置,就需要用到#include,下面我们给Debug添加一个Build Configuration,新建文件,类型为Configuration Settings File,并将Cocoapods自动生成的xcconfig以include的方式引入即可:

    #include "Pods/Target Support Files/Pods-ConfigFile/Pods-ConfigFile.debug.xcconfig"
    

    同时还需要在Xcode中将Configuration更改为我们刚刚添加的文件即可:


    customized configuration.png

    通常情况下,我们添加自定义Build Configuration,都是为了为不同的环境添加不同的配置参数,比如BASE URL,在xcconfig文件中,格式为 key = value

    #include "Pods/Target Support Files/Pods-ConfigFile/Pods-ConfigFile.debug.xcconfig"
    BASE_URL=http:/$()/www.domain.com
    

    这里需要注意一点是,在xcconfig文件中,//会被识别为注释,所以使用/$()/可以巧妙的解决这个问题。添加了配置后需要在代码中使用,需要在info.plist中添加一项key可以随便取一个这里暂时也用BASE_URLvalue必须为$(BASE_URL),value中的BASE_URL需要和xcconfig中的key同名。代码中:

    Bundle.main.infoDictionary!["BASE_URL"]! // 忽略 !
    

    在Cocoapods的项目中添加新的Build Configuration

    一般项目中会有多个环境,比如DebugSITUATProduction,添加后,需要从新运行pod install,Cocoapods会自动生成该新增Configuration的xcconfig文件。

    add build configuration.png

    继承关系

    编译项的继承关系如下所示,从Target Build Settings一直向上继承,Target Build Settings也就是我们从Xcode中的Build Settings

    • Platform Defaults
    • Xcode Project xcconfig File
    • Xcode Project File Build Settings
    • Target xcconfig File
    • Target Build Settings
    target build setting.png

    下面,我们从Cocoapods自动生成的xcconfig文件中了解一下Xcode Build Settings的继承

    ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
    FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher"
    GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
    HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher/Kingfisher.framework/Headers"
    LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'
    OTHER_LDFLAGS = $(inherited) -framework "Accelerate" -framework "Alamofire" -framework "CFNetwork" -framework "Kingfisher"
    OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
    PODS_BUILD_DIR = ${BUILD_DIR}
    PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
    PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
    PODS_ROOT = ${SRCROOT}/Pods
    USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
    

    从中挑一个来理解HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Kingfisher/Kingfisher.framework/Headers"
    这个Header Search Path是经常会涉及到的,当添加了第三方依赖,依赖的头文件会从这个路径里查找。最底层的Target Build Settings定义在project.pbxproj文件中,在该文件中,在编译过程中,会先尝试从该文件中查找HEADER_SEARCH_PATHS,若找到了会以该值作为查找header的路径,找不到则会依次向父级查找,在这个演示中,它的父级便是Pods-ConfigFile.debug.xcconfig,在这个config文件中HEADER_SEARCH_PATHS由一个字符串数组组数组成,以空格做分割,其中的第一个元素$(inherited)表明,它将继承它的父级的配置,它的父级则是Xcode Project xcconfig File,以此类推。

    Tips: 当我们刚创建好工程时,在project.pbxproj文件中是没有HEADER_SEARCH_PATHS,所以默认会从Pods-ConfigFile.debug.xcconfig获取。

    还有一些其他的语法如,条件语法:

    BUILD_SETTING_NAME[sdk=xxx][arch=yyy] = VALUE
    

    这个语法表明在sdk为xxx,并且arch为yyy时,取后面的VALUE值。

    相关文章

      网友评论

          本文标题:Xcode Configuration Settings Fil

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