草庐IT

iOS 多环境配置的三种方式

顶级蜗牛 2023-03-28 原文

概念:
Project:包含项目所有代码、资源文件、所有信息。
Target:对指定代码和资源文件的具体构建方式。
Scheme:对指定的Target的环境配置。

一、使用多targets配置环境

这个章节请看我分享的文章:最详细 Xcode的Targets管理项目的公开版本、测试版本、预发布版本
这里不多讲解

弊端:
1.生成多个info.plist文件
2.配置繁琐且乱,容易配置遗忘其它targets
3.通过声明宏的方式,容易写错
4.真机测试需要的描述文件等比较多

二、使用多Scheme配置环境

正常情况下,选择Edit Scheme ... -> Run -> Info 只有两个Build Configuration可以选择(Debug/Release)

这个Build Configuration是对应于 PROJECT 里的 Info -> Configuration

于是乎可以自定义添加我们所需要的Configuration环境

因为当前只有一个Scheme,当我们运行的时候,每次都来回点到Edit Scheme...切换环境,这无疑会导致容易操作疏漏的情况。

于是乎可以创建另外的Scheme,来配对刚才的配置环境,那每次选择环境的时候,只需要选择对应的Scheme就可以了:

此时就可以选择对应的Scheme去到Edit Scheme...配对它对应的配置环境了

那如果要区分环境去定义不同的 主机hostUrl呢?我们通过Add User-Defined Setting,自定义一个参数我起名为HOST_URL,它自动会分配三个环境,依次填入自己的主机域名即可(下图我做举例用)。

通过定义了这个自定义参数,要如何读取出来呢?通过在Info.plist去声明

Info.plist

访问HOST_URL就是读取Info.plist

// Swift
let mainBundle = Bundle.main
let identifer = mainBundle.bundleIdentifier
let info = mainBundle.infoDictionary
let CFBundleName = mainBundle.object(forInfoDictionaryKey: "CFBundleName")
let HOST_URL = mainBundle.object(forInfoDictionaryKey: "HOST_URL")
print("[identifer]:\(identifer!)")
print("[info]:\(info!)")
print("[CFBundleName]:\(CFBundleName!)")
print("[HOST_URL]: \(HOST_URL!)")
// OC 
NSString *path = [NSBundle.mainBundle pathForResource:@"Info" ofType:@"plist"];
NSDictionary *infoDic = [[NSDictionary alloc] initWithContentsOfFile:path];
NSLog(@"%@", infoDic[@"HOST_URL"]);

Building Settings里所有的参数都会分三个不同的环境,这就意味着可以设置不一样的Icons、图标、名称等等...

弊端:在Building Settings里可能会不断地去找对应的配置然后三个环境不断地配置,不方便。

三、使用 Scheme + Configurations 配置(推荐)

本文仅做操作教学,对.xcconfig一点都不懂的同学可以看这里:Swift进阶-工程化实践(一)

在上面demo的基础上,找到Build Settings -> User-Defined,将之前自定义个HOST_URL删掉
接下来新建三个.xcconfig文件,命名规则 目录-项目名.环境.xcconfig

Config-SchemeProject.Debug
Config-SchemeProject.Office
Config-SchemeProject.Release

.xcconfig生效,配置到对应的Configuration

生效后可以在Build Settings中看到这个配置了

附上demo
喜欢的老铁,点个⭐️

适配好多环境工程后仍存在一些问题的

问题一:

在我们没有配置xcconfig文件的工程,通过Cocoapods导入第三方库 $ pod install 后,我们的工程会自动配置成默认生效是使用了Pods-ProjectName.Debug.xcconfigProjectName.Debug.xcconfig这两个环境的xcconfig,那我们自定义的xcconfig就没法生效了。
解决问题一的方法:
在我们自定义的xcconfig中去导入Pods-ProjectName.Debug.xcconfig

xcconfig生效的地方设置成我们自定义的xcconfig文件即可。

问题二:

比如我们用Cocoapods导入第三方库AFNetworking,在自定义的Config-SchemeProject.Debug.xcconfig里有这样一句

OTHER_LDFLAGS = -framework "AFNetworking"

Cocoapods生成的xcconfig里也会有同一个设置值并且还有其它参数呢:

最后生效的只有我们自定义的xcconfig (解决完问题一的情况),而CocoapodsOTHER_LDFLAGS的其它参数并没有生效了

解决问题的的方法:
在自定义的xcconfig声明参数钱加上 $(inherited) 即可。 $(inherited)是继承的意思。

OTHER_LDFLAGS = $(inherited) -framework "AFNetworking"

有关iOS 多环境配置的三种方式的更多相关文章

  1. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  4. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  5. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  6. ruby-on-rails - 正确的 Rails 2.1 做事方式 - 2

    question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参

  7. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  8. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  9. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  10. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

随机推荐