关于ios:让你的iOS-app配置多个环境

前言

大多数开发者在开发的时候都会遇到多个环境的问题,development, test, production. 通常会通过宏或变量来管制,或者打包前手动切换环境变量,这种办法确实能够解决问题,只不过不是很优雅很高效。

开始吧 just do it!

  • 1. 新建Build Configuration

如图 创立新配置 零碎默认是2个,一个Debug,一个Release。这里咱们须要抉择是复制一个Debug还是Release。每个环境都有DebugRelease配置,Release不能调试程序,因为默认是屏蔽了可调试的一些参数,具体能够看BuildSetting外面的区别,而且编译时有做编译优化,会比用Debug打包进去的体积更小一点。

以开发和公布两个环境为例 (零碎默认的为开发环境)

我的项目中应用了Pod 关上Configuration Set就会发现是如下的样子

留神:刚刚新建完Build Configuration之后,这时如果有pod,请立刻执行一下

 pod install 

pod装置实现之后会主动生成xcconfig文件

  • 2. 新建Scheme

如图复制一个Scheme

更改配置为新的 Configuration

  • 3.创立xcconfig文件

配置我的项目目录 将xcconfig放到Config文件夹

新建xcconfig文件

在文件中创立一些变量 例如

//  DevConfig.xcconfig
//  Environments

// Server URL
ROOT_URL = http:/$()/localhost:3000

// Keys
API_KEY = 783u9djd8a_hkzos7jd803001nd

//Variable
THEME_TITLE = "测试题目"

// App Settings
APP_NAME = Env-Dev
APP_BUNDLE_ID = com.foo.env.dev

  • 4.从我的项目设置拜访配置值

回到 project – info – configurations 配置如下(图中有误)

配置一下拜访值

配置多个icon 和 启动展位图

进行这些更改后,能够应用“计划”选择器中的不同计划来构建和运行应用程序。后果是应用程序的两个不同版本,每个版本应用其相应的环境。

运行有效 能够尝试
CocoaPods对现有我的项目的正文:如果您要在现有我的项目中应用CocoaPods,并且想要持续进行上来,则您须要做一些额定的工作来进行设置,因为CocoaPods具备本人的xcconfig文件。

删除.xcworkspace档案
删除Podfile.lock文件和Pods/目录
保留Podfile
从新运行 pod install

  • 5.从代码拜访配置值

在info.plist中增加 CustomEnvironmentVariable 类型 为字典
配置键值如

当初这些变量在咱们的plist中了,咱们能够从Swift中拜访它们了。举荐的一种做法是创立Environment.swift文件。这将蕴含一个没有大小写的枚举,以用作拜访plist和其中蕴含的变量的命名空间。咱们将创立两个动态属性,rootURL 并将别离apiKey返回aURL和a String。咱们将在闭包中对其进行初始化,以蕴含从plist检索它们的逻辑,并fatalError:应用适当的音讯进行调用。

请留神,fatalError:在这种状况下,咱们已明确决定调用它,因为它示意编程谬误,而不是遇到预期的nil状态。咱们不心愿xcconfig文件或Info.plist不具备这些值,并且在提供此有用音讯的同时使应用程序解体将提供上下文并容许程序员进行纠正。

将此文件增加到_Configs_文件夹:

//
//  Environment.swift
//  Environments
//
//  Created by Foo on 2021/3/4.

import Foundation

public enum Environment {
    
    static let plistKey = "CustomEnvironmentVariable"

  // MARK: - Keys
  enum Keys {
    enum Plist {
      static let appName = "APP_NAME"
      static let themeTitle = "THEME_TITLE"
    }
  }

  // MARK: - Plist
  private static let infoDictionary: [String: Any] = {
    guard let dict = Bundle.main.infoDictionary else {
      fatalError("Plist file not found")
    }
    return dict
  }()

  // MARK: - Plist values
    static let appName: String = {
        guard let environmentVariable = Environment.infoDictionary[plistKey] as? [String: String] else {
            fatalError("Key environment not set in plist")
        }
        guard let value = environmentVariable[Keys.Plist.appName] else{
            fatalError("This Key not set in plist environment")
        }
        return value
    }()

    static let themeTitle: String = {
        guard let environmentVariable = Environment.infoDictionary[plistKey] as? [String: String] else {
            fatalError("Key environment not set in plist")
        }
        guard let value = environmentVariable[Keys.Plist.themeTitle] else{
            fatalError("This Key not set in plist environment")
        }
        return value
    }()
}

当初,咱们曾经创立了一种结构化的形式来拜访这些值
在须要应用的调用

 override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        view.addSubview(titleLabel)
        print(Environment.themeTitle)
    }

切换 打算Scheme 只用不同的变量值

实现 Done ????????????

应用Xcode配置文件是一种用于配置不同构建设置的优雅而弱小的解决方案。只管咱们在这里进行了大量的我的项目调整以使咱们的环境依照咱们心愿的形式进行设置,然而在您习惯了这样做之后,这在很大水平上是常规性的。请随便采纳咱们在此工作过的模板,并依据您的我的项目需要对其进行自定义!与未来必须一直从新扫视和修复问题相比,花工夫配置一次总是值得的。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理