xcconfig(环境变量) 的使用

xcconfig(环境变量) 的使用


一、上手使用

1、添加 xcconfig 文件

一般需要添加 Release 和 Debug 版本,这两者公用的数据,也可以添加一个通用的文件,比如我这里通用的叫做 Config.xcconfig
在这里插入图片描述


2、在文件中添加数据

字符串不需要加 引号

对通用文件的引用,使用 #include


在这里插入图片描述


3、将文件配置到工程中

在这里插入图片描述


可以通过终端查看所有 build setting,比如本项目中数据如下

$ cd /Users/dv/Desktop/XcconfigDemo 
$ xcodebuild -list
Information about project "XcconfigDemo":
    Targets:
        XcconfigDemo

    Build Configurations:
        Debug
        Release

    If no build configuration is specified and -scheme is not passed then "Release" is used.

    Schemes:
        XcconfigDemo


获取项目中的所有配置(包含默认配置),并输出

$ xcodebuild -showBuildSettings
$ xcodebuild -project HelloWorld.xcodeproj -target HelloWorld -configuration Debug -showBuildSettings > xcodebuild_showBuildSettings.txt

$ xcodebuild -scheme "XcconfigDemo"  -showBuildSettings  >> mynew.xcconfig  # 查看指定 scheme 的环境变量

在这里插入图片描述


4、使用环境变量

这里我将名字使用环境变量来显示

在这里插入图片描述

运行起来后,应用的名字变成了我们想要的结果。


5、使用 Pod 的项目

pod 也是使用 xcconfig 来管理配置,可以看工程中 Pods 下面的 Targets Support Files 文件夹。

引入了 pod 的项目,默认的 Configurations 为 pod 的 xcconfig;

为了不影响 pod 的使用,需要在我们的 xcconfig 的debug 和 release 中分别引入,方法如下

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

其它疑问

  • 环境变量的数据类型是什么呢?

  • 如何在代码中使用环境变量呢?

    一种写法是:

    GCC_PREPROCESSOR_DEFINITIONS = $(inherited) kHostDefault='$(kHostDefault)' kHostAlpha='$(kHostAlpha)' kHostAlphaBox='$(kHostAlphaBox)' kLIVE_SKD_APPKEY='$(kLIVE_SKD_APPKEY)' kBUGLY_ID='$(kBUGLY_ID)' kUM_CHANNEL_ID='$(kUM_CHANNEL_ID)' kUM_APPKEY='$(kUM_APPKEY)' 
    
  • 如何在 xib 的配置中使用环境变量呢?


二、语法

1、注释:

  • 没有多行注释
  • 单行注释以//开头。

2、包含语句:

  • #include 开头,后面添加文件路径。#include "Debug.xcconfig"
  • 多层路径的#include:#include "/Makefiles/CoreOS/Xcode/BSD.xcconfig"

3、变量

  • 开始以_、大写字母或者小写字母,可以含有:_0~9a~zA~Z
  • 在两个变量名或者变量与值之间使用=

4、变量分配

  • 如果想使用变量默认值,就不用在此变量的=后面添加任何值。

5、重写

// Variable set in the project file
OTHER_LDFLAGS = -ObjC

// lib.xcconfig
OTHER_LDFLAGS = -framework Security

编译时,OTHER_LDFLAGS 会是-framework Security, -ObjC 会被 -framework Security 重写。


6、继承

// Variable set in the project file
OTHER_LDFLAGS = -ObjC

// lib.xcconfig
OTHER_LDFLAGS = $(inherited) -framework Security

编译时,OTHER_LDFLAGS 会是-ObjC -framework Security


三、相关概念

workspace

workspace,顾名思义就是我们的工作区。一个workspace可以包含多个project以及一些其它文件。workspace也可以把多可以project组织起来。


project

一个 project 会包含属于这个项目的所有文件,资源,以及生成一个或者多个软件产品的信息。


target

一个project会包含一个或者多个 target,而每一个 target 都对应一个products,也就是最终产生的.app。


configuration & build settings

一个 targets 可以有多个 configuration(如我们平常用到的 debug 和 release,当然我们还可以自己添加),每个configuration 就会有对应的 build settings。每次build都是在一个configuration下build的。

build setting 中包含了 product 生成过程中所需的参数信息。project的build settings会对于整个project 中的所有targets生效,而target的build settings是重写了project的build settings,重写的配置以target为准。


scheme

那么,什么又是scheme呢?scheme就相当于一个组织者。在build的时候,schema会指定一个target和configuration,这样就能保证在build的时候configuration的唯一性,就能产生一个特定的product。


四、常见环境变量

  • $(TARGET_NAME)

目标工程名称


  • $(BUILT_PRODUCTS_DIR)

最终产品路径
build成功后的,最终产品路径--可以在Build Settings参数的Per-configuration Build Products Path项里设置


  • $(SRCROOT)

工程文件(比如Nuno.xcodeproj)的路径


  • $(CURRENT_PROJECT_VERSION)

当前工程版本号


  • $(PRODUCT_NAME)

product name,产品名字


  • $(PRODUCT_BUNDLE_IDENTIFIER)

  • Framework/Library Search Paths

表示framework和Library引用的路径,改路径是你工程下的绝对路径


  • $(SRCROOT)

工程文件目录,表示你的XXX.xcodeproj文件的目录,而你引用的framework和 Library相对xxxx.xcodeproj文件的目录就可以直接添加在$(SRCROOT)/后面了。

例如 $(SRCROOT)/Find/who.framework 表示who.framework文件是在你的工程xxxx.codeproj下的一个Find文件夹下。


  • $(EFFECTIVE_PLATFORM_NAME)

宏代表当前配置是OS还是simulator


4.一般情况下是不用特意去设置这些Search Paths的万一路径错了,就将你的framework和Library文件重新引用一遍就可以了,xcode 会自动设置这些路径的。

//以下的“=”表示右边的表达式就是左边表达式的值!


  • $(BUILD_DIR)

$(BUILD_DIR) = /Users/xxx/Library/Developer/Xcode/DerivedData/xxxWorkspace-caepeadwrerdcrftijaolkkagbjf/Build/Products

表示程序编译后的路径,一般是表示在 Xcode 的 DerivedData 文件夹下编译后你的工程为xxxWorkspace-caepeadwrerdcrftijaolkkagbjf

说明:$(BUILD_DIR)是不能通过build Setting改变的,而下面的都是可以通过build Setting来改变他们的值的,以下都是默认情况下,主要是为了说明宏的意思


  • $(SDK_NAME)

$(SDK_NAME)=iphonesimulator5.0 表示获取当前SDK的名字


  • $(PLATFORM_NAME)
    = iphonesimulator 表示获取当前程序运行的平台

  • $(TARGET_NAME)

$(TARGET_NAME) = UtilLib 表示工程文件名UtiLib


  • $(EXECUTABLE_NAME)

    $(EXECUTABLE_NAME) = libUtilLib.a,表示可执行文件libUtiLib.a


  • $(ACTION)
    $(ACTION) = build表示当前操作是编译操作

  • $(CURRENTCONFIG_SIMULATOR_DIR)

表示当前模拟器路径


  • $(CURRENTCONFIG_DEVICE_DIR)

表示当前设备路径


  • ${CONFIGURATION}

表示当前状态是调试Debug还是运行状态release


  • ${CONFIGURATION}

${CONFIGURATION}-iphoneos 表示:Debug-iphoneos(如果当前模式是Debug)


  • $(BUILD_DIR)

$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME =/Users/xxx/Library/Developer/Xcode/DerivedData/xxxWorkspace-caepeadwrerdcrftijaolkkagbjf/Build/Products/Debug-iphonesimulator
表示在模拟器的调试状态下


  • $(CURRENTCONFIG_DEVICE_DIR)

当然也可以自己定义路径,比如当前设备路径
$(CURRENTCONFIG_DEVICE_DIR) = ${SYMROOT}/${CONFIGURATION}-iphoneos 其中


  • ${SYMROOT}

/Users/xxx/Library/Developer/Xcode/DerivedData/xxxWorkspace-caepeadwrerdcrftijaolkkagbjf/build/products 目录


  • $(CREATING_UNIVERSAL_DIR)

$(CREATING_UNIVERSAL_DIR) = /Users/xxx/Library/Developer/Xcode/DerivedData/xxxWorkspace-caepeadwrerdcrftijaolkkagbjf/Build/Products/Debug-universal


  • $(BUILT_PRODUCTS_DIR)

$(BUILT_PRODUCTS_DIR) = /Users/xxx/Library/Developer/Xcode/DerivedData/xxxWorkspace-caepeadwrerdcrftijaolkkagbjf/Build/Products/Debug-iphonesimulator

表示程序编译后的目录


  • $(inherited)

Project 的 Building Settings 中的设置 默认并不被 Targets 继承,只有当Targets的设置加入了 (inherited) 时才被继承,添加目录的时候写上(inherited) 就表示从 frameworks 里面读取。

继承自更高一级的配置

-》 由到高低的配置,分别是:

Basic的Project中的配置-》此处的Target的配置-》具体的Debug还是Release的配置


五、build Settings 常见参数

  1. Installation Directory:安装路径

静态库编译时,Build Settings中Installation Directory 设置为 $(BUILT_PRODUCTS_DIR)

Skip Install 设为YES,因为Installation Directory默认为 /usr/local/lib,Skip Install 如果是NO,可能会被安装到默认路径 /usr/local/lib

  1. Public Headers Folder Path:对外公开头文件路径

如果设为“include”(具体的头文件路径为:$(BUILT_PRODUCTS_DIR)/include/xx.h)

在最终文件.a同级目录下生成一个include目录

默认:/usr/local/include

Public Headers Folder Path这个路径就是使用这lib的某工程需要依赖的外部头文件.导入这路径后,#include/import “xx.h” 才能看到

  1. User Header Search Paths:依赖的外部头文件搜索路径

如果设置为 $(BUILT_PRODUCTS_DIR)/include 和2中路径对应

  1. Per-configuration Build Products Path:最终文件路径

比如设为“…/app”,就会在工程文件.xcodeproj上一层目录下的app目录里,创建最终文件

默认为$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

等于 $(BUILT_PRODUCTS_DIR)

  1. Per-configuration Intermediate Build Files Path:临时中间文件路径

默认为:$(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

  1. Code Signing Identity:真机调试的证书选择

选一个和Bundle identifier相对应的证书

Library Search Paths:库搜索路径

Architectures:架构,设为 armv6 或 armv7

Valid Architectures:应用框架,可以设为 armv6、 armv7 或i386

Product Name:工程文件名,默认为$(TARGET_NAME)

Info.plist File:info文件路径

Build Variants:默认为normal

Other Linker Flags:其他链接标签

设为“-ObjC"

当导入的静态库使用了类别,需要设为-ObjC

iOS Deployment Target:ios部署对象

比如可以选择设为,ios3到ios5的一种版本

Prefix Header:预编头文件(比如:UtilLib/UtilLib-Prefix.pch)

Precompile Prefix Header:设为“Yes”,表示允许加入预编译头


六、OBJC 环境变量

变量名 介绍 备注
OBJC_PRINT_OPTIONS list which options are set 输出OBJC已设置的选项
OBJC_PRINT_IMAGES log image and library names as they are loaded 输出已load的image信息
OBJC_PRINT_LOAD_METHODS log calls to class and category +load methods 打印 Class 及 Category 的 + (void)load 方法的调用信息
OBJC_PRINT_INITIALIZE_METHODS log calls to class +initialize methods 打印 Class 的 + (void)initialize 的调用信息
OBJC_PRINT_RESOLVED_METHODS log methods created by +resolveClassMethod and +resolveInstanceMethod: 打印通过 +resolveClassMethod: 或 +resolveInstanceMethod: 生成的类方法
OBJC_PRINT_CLASS_SETUP log progress of class and category setup 打印 Class 及 Category 的设置过程
OBJC_PRINT_PROTOCOL_SETUP log progress of protocol setup 打印 Protocol 的设置过程
OBJC_PRINT_IVAR_SETUP log processing of non-fragile ivars 打印 Ivar 的设置过程
OBJC_PRINT_VTABLE_SETUP log processing of class vtables 打印 vtable 的设置过程
OBJC_PRINT_VTABLE_IMAGES print vtable images showing overridden methods 打印 vtable 被覆盖的方法
OBJC_PRINT_CACHE_SETUP log processing of method caches 打印方法缓存的设置过程
OBJC_PRINT_FUTURE_CLASSES log use of future classes for toll-free bridging 打印从 CFType 无缝转换到 NSObject 将要使用的类(如 CFArrayRef 到 NSArray * )
OBJC_PRINT_GC log some GC operations 打印一些垃圾回收操作
OBJC_PRINT_PREOPTIMIZATION log preoptimization courtesy of dyld shared cache 打印 dyld 共享缓存优化前的问候语
OBJC_PRINT_CXX_CTORS log calls to C++ ctors and dtors for instance variables 打印类实例中的 C++ 对象的构造与析构调用
OBJC_PRINT_EXCEPTIONS log exception handling 打印异常处理
OBJC_PRINT_EXCEPTION_THROW log backtrace of every objc_exception_throw() 打印所有异常抛出时的 Backtrace
OBJC_PRINT_ALT_HANDLERS log processing of exception alt handlers 打印 alt 操作异常处理
OBJC_PRINT_REPLACED_METHODS log methods replaced by category implementations 打印被 Category 替换的方法
OBJC_PRINT_DEPRECATION_WARNINGS warn about calls to deprecated runtime functions 打印所有过时的方法调用
OBJC_PRINT_POOL_HIGHWATER log high-water marks for autorelease pools 打印 autoreleasepool 高水位警告
OBJC_PRINT_CUSTOM_RR log classes with un-optimized custom retain/release methods 打印含有未优化的自定义 retain/release 方法的类
OBJC_PRINT_CUSTOM_AWZ log classes with un-optimized custom allocWithZone methods 打印含有未优化的自定义 allocWithZone 方法的类
OBJC_PRINT_RAW_ISA log classes that require raw pointer isa fields 打印需要访问原始 isa 指针的类
OBJC_DEBUG_UNLOAD warn about poorly-behaving bundles when unloaded 卸载有不良行为的 Bundle 时打印警告
OBJC_DEBUG_FRAGILE_SUPERCLASSES warn about subclasses that may have been broken by subsequent changes to superclasses 当子类可能被对父类的修改破坏时打印警告
OBJC_DEBUG_FINALIZERS warn about classes that implement -dealloc but not -finalize 警告实现了 -dealloc 却没有实现 -finalize 的类
OBJC_DEBUG_NIL_SYNC warn about @synchronized(nil), which does no synchronization 警告 @synchronized(nil) 调用,这种情况不会加锁
OBJC_DEBUG_NONFRAGILE_IVARS capriciously rearrange non-fragile ivars 打印突发地重新布置 non-fragile ivars 的行为
OBJC_DEBUG_ALT_HANDLERS record more info about bad alt handler use 记录更多的 alt 操作错误信息
OBJC_DEBUG_MISSING_POOLS warn about autorelease with no pool in place, which may be a leak 警告没有 pool 的情况下使用 autorelease,可能内存泄漏
OBJC_DEBUG_DUPLICATE_CLASSES halt when multiple classes with the same name are present 当出现类重名时停机
OBJC_USE_INTERNAL_ZONE allocate runtime data in a dedicated malloc zone 在一个专用的 malloc 区分配运行时数据
OBJC_DISABLE_GC force GC OFF, even if the executable wants it on 强行关闭自动垃圾回收,即使可执行文件需要垃圾回收
OBJC_DISABLE_VTABLES disable vtable dispatch 关闭 vtable 分发
OBJC_DISABLE_PREOPTIMIZATION disable preoptimization courtesy of dyld shared cache 关闭 dyld 共享缓存优化前的问候语
OBJC_DISABLE_TAGGED_POINTERS disable tagged pointer optimization of NSNumber et al. 关闭 NSNumber 等的 tagged pointer 优化
OBJC_DISABLE_NONPOINTER_ISA disable non-pointer isa fields 关闭 non-pointer isa 字段的访问

参考

https://www.jianshu.com/p/aad1f9e72382

http://www.cocoachina.com/ios/20141225/10761.html

发布了43 篇原创文章 · 获赞 8 · 访问量 4586

猜你喜欢

转载自blog.csdn.net/weixin_45390999/article/details/104481185