首页 > 其他分享 >iOS Xcode使用xcconfig配置环境参数(Debug&Release)

iOS Xcode使用xcconfig配置环境参数(Debug&Release)

时间:2023-05-15 23:32:26浏览次数:36  
标签:自定义 xcconfig Xcode 配置 环境参数 Release Debug


需求

  • 在App开发中经常有一些环境参数随着环境(开发环境、演练环境(测试环境)、生产环境)的不同而配置不同,例如接口的基本地址baseURL,加密使用的密钥等,以接口的基本地址为例:可能在开发环境中直接使用内网地址配置“http://192.168.1.1:8080/appname/api“, 在生产环境(发布环境)使用域名配置”http://api.appname.com“, 这些值应该如何更优雅的配置呢?最不推荐的做法是在预编译头文件.pch中定义两个宏定义,如下
#define BaseURL @"192.168.1.1:8080/appname/api"
// #define BaseURL @"http://api.appname.com"

开发的时候将生产的配置注释掉,在发布的时候把测试的配置注释掉,来回切换,这样也能达到目的,但是这种做法有一个不能容忍的缺点是要手动切换配置,项目中一般会有多个这样的环境参数,假如在发布的时候忘记切换,后果自己想吧,等着哭吧。。。

  • 为了解决手动切换环境参数可以通过Debug模式判断来定义,这样在App发布的时候就不用做任何切换就能动态的切换配置,再也不用手动切换环境参数了!,代码如下
#ifdef DEBUG
#define BaseURL @"192.168.1.1:8080/appname/api"
#define PublicKEY @"QWE3R23WR09WURI220WR3TTY5ET3CR2X"
#else
#define BaseURL @"http://api.appname.com"
#define PublicKEY @"32GDG4575UB5M97O7M2X32RFH53QWT43"
#endif
  • 上述宏定义一般定义在.pch中,通常.pch文件中定义的宏都比较杂乱,希望能单独放在一个独立的文件中,可以通过新建一个头文件env.h, 把上述宏定义放到env.h中,在需要使用的时候导入头文件即可,把环境参数单独放在一个独立的头文件中,更加简洁,职能更加专一,也便于维护但是这种做法还不是最好的,因为还需要手动导入头文件,而且生产环境参数和开发环境参数是放在同一个文件中而是不是独立分开的,要想独立分开并且使用时又不用导入头文件可以通过Xcode中的Configurations Setting Fil(.xcconfig)来解决,这应该是最优的实现方式。

最优解决方案

Xcode中可以创建.xcconfig配置文本,该配置文件Xcode会根据当前模式是Debug模式还是Release模式自动选择对应的配置文件去加载,我们在项目中或其他地方就像使用在.pch文件中定义的宏那样来直接使用.xcconfig配置文件中定义的常量值

具体操作步骤

1、 创建三个Configuration Settings File文件,该文件的后缀为.xcconfig, 三个文件的命名分别命名为Common.xcconfig, Debug.xcconfig, Release.xcconfig, Debug.xcconfig和Release.xcconfig可以使用#include来包含Common.xcconfig配置文件, 注意在创建.xcconfig的时候Xcode默认是不会选中Targets的,注意要选中!

iOS Xcode使用xcconfig配置环境参数(Debug&Release)_Common

iOS Xcode使用xcconfig配置环境参数(Debug&Release)_自定义_02

2、 分别在Debug.xcconfig、Release.xcconfig中定义键值对,在Common.xcconfig中来暴露键,以便外界能够使用自定义的键,在每个模式下配置文件中的Key要保持一致,关于Scheme系统默认提供Debug和Release两种模式,也可以自定义其他模式

注意特殊字符(/)可能需要使用\转义,有时候不转义字符串会自动截断的,这里好像不转义也可以

iOS Xcode使用xcconfig配置环境参数(Debug&Release)_Common_03

iOS Xcode使用xcconfig配置环境参数(Debug&Release)_配置文件_04

iOS Xcode使用xcconfig配置环境参数(Debug&Release)_xcconfig_05

注意:使用#include语法来包含其他配置文件,如#include "Common.xcconfig", 最好是放在文件的最后面,放在文件的开头也可以

注意:Common.xconfig中第一个键的配置必须有 :GCC_PREPROCESSOR_DEFINITIONS = $(inherited),没有Xcode会报错

暴露自定义键时的语法: 宏名='$(key)', 在代码或其他地方使用宏名来引用,'$(key)':通过key来指定每个模式下的对应的自定义键的名字,通常将宏的名字和key的名字保持一致, 注意 等号前后一定不能有空格

特别注意:Common.xconfig中第一个key是GCC_PREPROCESSOR_DEFINITIONS = $(inherited) 后面跟自定义的key,注意在第一个key后面跟上自己定义的key的时候一定不要回车换行,敲一个空格,然后在同一行后面追加就行了,换行会编译错误, 不能换行,不能换行,不能换行!

3、 切换到PROJECT—->info—>Configurations下,分别配置Debug和Release模式下对应的.xcconfig配置文件,当创建了.xcconfig文件后,在每个模式下自动作为一个选项来选择,这样直接选择.xcconfig对应的文件名字即可

iOS Xcode使用xcconfig配置环境参数(Debug&Release)_xcconfig_06

配置完成后可以看到在TARGETS(目标)—>Build Settings—-> Preprocessor Macros:在Debug和Release下分别出现了刚才配置的API_URL,如果出现说明配置生效了,如果没有看到试着先编译一下

只要新建.xcconfig并且配置了PROJECT—->info—>Configurations,不用包含Common.xcconfig,在User-Defined就能看到自定义的键,但是这里的键并不能在代码中使用,因为自定义键还没有暴露出来

iOS Xcode使用xcconfig配置环境参数(Debug&Release)_自定义_07

当在Common.xcconfig中暴露了Debug和Release中自定义的键时此时Preprocessor Macros才能看到自定义的值会出现,此时代码中才能访问自定义的键

iOS Xcode使用xcconfig配置环境参数(Debug&Release)_Common_08

4、在代码中使用配置的key

iOS Xcode使用xcconfig配置环境参数(Debug&Release)_配置文件_09


xcconfig的其它作用

xcconfig的功能不止用于项目中环境变量的配置,对于一个App对应于多个Target,而每一个Target对应于不同的参数,此时也可以对每一个Targe配置对应的.xcconfig文件,上面操作是针对于整个项目,还可以具体到项目中的每个Target进行配置

xcconfig还可以配置info.plist中的配置,如Bundle name, Bundle Identifity

xcconfig还可以配置一些Xcode的编译的变量



标签:自定义,xcconfig,Xcode,配置,环境参数,Release,Debug
From: https://blog.51cto.com/u_16114318/6281609

相关文章

  • Xcode中常见的环境变量
    为当前项目添加.pch文件新建.pch文件,pch文件的命名规则:“工程名字-Prefix.pch”,当然也可以不遵守这个规则随意命名指定pch文件所在的位置(既然我是新建的pch文件,Xcode为何不直接给我设置pch文件的路径,还要开发者做这件事,真是不人性化),在BuildSettings中搜索PrefixHeader,然后在该......
  • 问鼎CodeXGLUE榜单,华为云UniXcoder-VESO-v1算法取得突破
    摘要:华为云PaaS技术创新团队基于UniXcoder模型,在公开测试数据集(CodeXGLUE)上的代码搜索任务评测结果上取得突破,在CodeXGLUE榜单上排名中第一。本文分享自华为云社区《代码语义搜索算法哪家强?华为云UniXcoder-VESO-v1算法取得突破,问鼎CodeXGLUE榜单第一名》,作者:华为云软件分析Lab......
  • xcode打包导出ipa
    xcode打包导出ipa众所周知,在开发苹果应用时需要使用签名(证书)才能进行打包安装苹果IPA,作为刚接触ios开发的同学,只是学习iosapp开发内测,并没有上架appstore需求,对于苹果开发者账号认证需要支付688,真的是极大的浪费,使用appuploader,只需要注册苹果普通的账号,不需要688认证,就可以打包......
  • Xcode编译流程
     Xcode的构建过程本质上是执行一系列构建任务。如:代码检测,编译代码,链接目标文件,拷贝资源(图片,plist,nib)文件,代码签名等。大部分任务是执行命令行工具,如(clang编译、ld链接、codesign签名,altool上传)。这些工具使用xcode项目的配置信息,根据特定的顺序执行。bulidSystem的工......
  • Xcode 14 m1 系统 遇见的坑
    我是查看环信demo遇到了记下来1、是运行摸机器一直报错xxx.o文件找不到  forarchitecturearm64 podfile文件post_installdo|installer|installer.generated_projects.eachdo|project|project.targets.eachdo|target|target.build_c......
  • xcode历史版本下载
    一、背景较早之前做过一个项目,当时使用swift3.x开发。项目结束后就没再有新需求与更新。但最近呢需要对项目的某些功能进行调整,项目又重新被拾了起来。我们知道现在的swift版本已经到了5.x,相应的语法上较3.x版本也有了不小的变化。使用最新版本的xcode都已经不支持swift......
  • Unity通过PBXProject生成XCode工程
    Unity版本:2020.3.47f1首先通过PostProcessBuildAttribute监听XCode工程导出完成事件,GetUnityMainTargetGuid是获取XCode工程中"Unity-iPhone"对应的target,GetUnityFrameworkTargetGuid则对应"UnityFramework",在unity中大部分操作会是针对UnityFramework。PBXProject的很多操作都......
  • M1 Mac Xcode模拟器无法运行
    from:https://www.jianshu.com/p/87a5cca2a490 新版本的M1芯片运行模拟器报CocoaPods库(如:WechatOpenSDK报arm64错误)错误,是因为M1兼容问题,解决办法有两种如下:强烈推荐方法2方法1:强制打开xcode对x86的支持,有缺点:因为还是采用x86,编译速度很慢。关闭xcode--应用程序--xocde--......
  • cocoapods Xcode 14.3 Archive Command PhaseScriptExecution failed with a nonzero
    Xcode升级到14.3进行  Archive CommandPhaseScriptExecutionfailedwithanonzeroexitcode解决方法Xcode搜索 source="$(readlink-f"${source}")"将 source="$(readlink-f"${source}")"改为 source="$(readlink-f"......
  • Apple Xcode 14.3 (14E222b) 正式版发布下载
    AppleXcode14.3(14E222b)正式版发布CommandLineToolsforXcode14,tvOS16&watchOS9SimulatorRuntime请访问原文链接:https://sysin.org/blog/apple-xcode-14/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgXcode14包含了在所有Apple平台上开发、测......