热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOS多环境切换

背景在应用开发中,我们的流程为:开发-测试-预发布-发布AppStrore所以就会有不同的环境,比如开发环境,测试环境&

背景

在应用开发中,我们的流程为:开发-测试-预发布-发布 AppStrore

所以就会有不同的环境,比如开发环境,测试环境,预发布环境以及正式环境。

那么就会产生配置不同环境的如下需求。


  • 不同环境设置不同 host ,应用图标(可选)
  • 能够快速查看环境、版本号、build 号等信息
  • 能够配合自动打包

根据是否需要编译重新打包分为以下两种方式


  1. App 内动态切换
  2. 多环境配置打包编译切换

App 内动态切换

这种方式我们可以通过创建影藏入口,在影藏入口的页面内切换环境(同时,我们也可以将环境,版本号,build号等信息在页面内显示)。

优点:不需要再次打包。

这里的原理主要靠代码逻辑和本地化记录来实现切换。


多环境配置打包编译

我们配置多个环境的配置文件(Configuration Setting file),通过编译打包选择对应的配置,来达到切换环境,改变应用图标等功能。

这里我使用多 Schemes + ConfigurationSettingFile 的形式。


添加 Configuration

Xcode 项目默认有 Debug 和 Release 两个配置。显然是不够用的。

首先在 Xcode 中打开项目,选中 PROJECT, 选中 Info

找到Configurations点击底部的 +,然后复制一份 Debug。

如下图:

截屏2022-04-14 下午1.59.45

同样的方式,我们创建了 Test 和 PreRelease

截屏2022-04-14 下午2.01.11


User-Defined

User-Defined可以在 Build Seting 中自定义参数,可以通过点击 +来添加自定义参数,以便在 Info.plist 或者 编译中参数使用。

截屏2022-04-14 下午3.48.20

在配置文件中添加的 key-value 等同与添加User-Defined 参数(即,最后配置文件中的 key-value 都会同步到这边来)

User-Defined 的使用可以iOS 开发,利用 Build Configuration + Schemes 多环境配置中二.创建 User-Defined Setting]


注意:User-Defined 分为 PROJECT 和 TARGETS 级别,建议在对应 TARGET 中添加



添加 Configuration Setting File

Configuration Setting File 是为了更好的管理配置项,避免参数分散在 Build Setting 中。

Configuration Setting 文件是可以继承的。建议设置一个``Base`Configuration Setting 文件。

通过新建文件的方式可以创建 Configuration Setting File

截屏2022-04-14 下午2.16.43

这里我创建了一个base和其他四个对应环境的 Configuration Setting 文件。

截屏2022-04-14 下午2.24.00

接下来,就是为你的每一个环境匹配对应的配置文件。

截屏2022-04-14 下午2.26.30

如果你使用了 Cocoapods。

你编译的时候可能会遇到Unable to load contents of file list: '/Target Support Files/Pods-AnyTest/Pods-AnyTest-frameworks-PreRelease-input-files.xcfilelist'错误。

这个时候需要在终端,重新执行pod install

执行后,你有可能遇到下面警告

[!] CocoaPods did not set the base configuration of your project because your project already has a custom config set. In order for CocoaPods integration to work at all, please either set the base configurations of the target `AnyTest` to `Target Support Files/Pods-AnyTest/Pods-AnyTest.debug.xcconfig` or include the `Target Support Files/Pods-AnyTest/Pods-AnyTest.debug.xcconfig` in your build configuration (`AnyTest/Config/Config.debug.xcconfig`).[!] CocoaPods did not set the base configuration of your project because your project already has a custom config set. In order for CocoaPods integration to work at all, please either set the base configurations of the target `AnyTest` to `Target Support Files/Pods-AnyTest/Pods-AnyTest.test.xcconfig` or include the `Target Support Files/Pods-AnyTest/Pods-AnyTest.test.xcconfig` in your build configuration (`AnyTest/Config/Config.test.xcconfig`).[!] CocoaPods did not set the base configuration of your project because your project already has a custom config set. In order for CocoaPods integration to work at all, please either set the base configurations of the target `AnyTest` to `Target Support Files/Pods-AnyTest/Pods-AnyTest.release.xcconfig` or include the `Target Support Files/Pods-AnyTest/Pods-AnyTest.release.xcconfig` in your build configuration (`AnyTest/Config/Config.release.xcconfig`).[!] CocoaPods did not set the base configuration of your project because your project already has a custom config set. In order for CocoaPods integration to work at all, please either set the base configurations of the target `AnyTestTests` to `Target Support Files/Pods-AnyTestTests/Pods-AnyTestTests.prerelease.xcconfig` or include the `Target Support Files/Pods-AnyTestTests/Pods-AnyTestTests.prerelease.xcconfig` in your build configuration (`AnyTest/Config/Config.prerelease.xcconfig`).

别紧张,我们现在就去修复

现在打开,我们的 Config.debug 配置文件,必须继承 Cocoapods 的对应环境的配置文件,以便 Cocoapods能正确运行。

截屏2022-04-14 下午2.40.16

现在再编译,就可以编译成功了。

相同的操作,我们把其他环境的 pod 继承也对应添加进去。


创建 Scheme

为了我们快速选择编译运行环境,我们应该创建对应环境的 Scheme.

选中项目-> New Scheme ,创建

截屏2022-04-14 下午2.49.38


默认创建的 Scheme 不可以改名字,你可能删除后创建一个新命名的 Scheme


如下图,创建了对应环境的 Scheme.

截屏2022-04-14 下午2.54.28

新建的 Scheme 的 Build Configuration 默认是以 Debug 为基础的。所以我们需要编辑每一个 Scheme,以确保它与编译配置一一对应。

截屏2022-04-14 下午2.57.45


添加配置参数

在 base 中定义公共参数,以便公共控制

Config.base 配置文件示例

APP_NAME = AnyTest // 应用名
APP_ICON = AppIcon // 图标名
BUNDLE_ID = com.xxx.AnyTest //包名
HOST_URL = www.base.com // 后端地址

Config.debug 配置文件示例

#include "Config.base.xcconfig" // 继承 base,以便公共控制
#include "Pods/Target Support Files/Pods-AnyTest/Pods-AnyTest.debug.xcconfig" // 继承 cocopods 以便其正常工作APP_NAME = ${inherited}Debug // = AnyTestDebug
APP_ICON = ${inherited}Debug //= AppIconDebug
BUNDLE_ID = ${inherited}.Debug //= com.xxx.AnyTest.debug
HOST_URL = www.debug.com

其他三个文件类似 Config.debug 去设置。


不同环境 Host 获取


通过添加自定义字段在 info.plist 获取

在 target info 中添加一个字段Host_URL,设置值为$(HOST_URL)

截屏2022-04-14 下午4.38.12

在代码中通过读取 info.plist 方式获取

func readHostURLFromInfoPlist() -> String? {guard let path = Bundle.main.path(forResource: "Info", ofType: "plist") else {return nil}let infoDic = NSDictionary(contentsOfFile: path)let host = infoDic?["Host_URL"] as? Stringreturn host}

如果不想通过添加 Configuration Setting File来配置 host url ,也可以通过 target -> build setting -> Preprocessor Macros 来定义不同环境的标记,在代码中通过条件编译来区分 host



设置不同环境的应用名

同样,通过将 info.plist 中的应用名字段修改为配置文件中定义的 Key

截屏2022-04-14 下午5.21.56


注意:应用名称不是 Bundle name 哈



设置不同环境包名

同理,在info.plist 文件中将 key 修改为配置文件中的 key 即可

截屏2022-04-14 下午5.19.49


tip:生成不同包名,就会生成不同应用哟



设置不同环境图标

为了能看到图标就知道是什么环境的,可以让设计添加对呀环境的水印,来达到所见即所得。

同样是可以在 info.plist 中将对应 Key 设置为配置文件定义 Key


如何在运行时改变 App 的图标

利用 ImageMagic可以实现动态更新图标,将重要信息(环境水印,version, build version 等)写在图标上。

参考如何在运行时改变 App 图标 或者 iOS App 图标添加版本信息

示例源代码https://github.com/CodeOcenS/multiConfig


扩展


Xcode Build Settings

包含了 Xcode 编译参数和各种解释和定义,可以在编写脚本时查询

Xcode Build Setting 整理 – 中文解释版本

Xcode Build Setting 常用设置


推荐阅读
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 嗨,我想用多处理来加速我的代码。但是,apply_async对我不起作用。我试着做一个简单的例子,比如:frommultip ... [详细]
  • 我的iOS开发入门自学路径
    我有一个清单,列着希望在大学里完成的事。比如,学一门乐器,和朋友去旅游,搭建自己的博客,去滑翔,看各主题的书籍。其中一项是,写自己的App并且上架。去年开始,我准备完成这一项,所以 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • Annotation的大材小用
    为什么80%的码农都做不了架构师?最近在开发一些通用的excel数据导入的功能,由于涉及到导入的模块很多,所以开发了一个比较通用的e ... [详细]
  • 其实之前也有下载过完整的android源码,但是从来没有对这个做过一些总结,在加上最近需要经常去看,索性就在从新下载,编译一下,其实这些东西官网上面都有。http:sou ... [详细]
  • imnewtotheswiftandxcodeworld,soimhavingaproblemtryingtointegrateapackagetomypro ... [详细]
  • linux编写弹球游戏,手把手教你开发一款基于Box2D的弹球游戏(一)
    今天我们来介绍一款物理引擎,并基于它完成一个弹球游戏。提到物理引擎,就是在游戏中模拟真实世界的运动,碰撞,摩擦等等。Coco ... [详细]
  • iOS开发Debug和Release的理解
    2019独角兽企业重金招聘Python工程师标准参考:http:blog.csdn.netmad1989articledetails406580331&# ... [详细]
  • IvebeentryingforadayortwototryandgetashadowtodrawinsidethetextofanNSTextField ... [详细]
author-avatar
xzcxzfvxvc
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有