多Target解决开发和生产环境区分问题
最近一段时间,遇到一个区分生产和开发环境的问题。
现有的解决方案,在代码中使用了全局变量,对于环境的区分,都依赖于这个全局变量。
每次测试和App打包发布 App Store,必须要记得更改代码中的环境配置代码。这就会到导致一些问题,比如,打包时,忘记了将环境配置代码更改为生产环境,导致线上发布的App变成开发版本,后果很严重。
经过一番查找,参考网上的一些解决方法,于是采用多Target来区分App的运行环境。
一些优点:
- 避免每次打包都要手动更改代码,现在使用Schemes进行区分。
- 在测试的机器上,可将开发和生产的App区分开,为测试版提供特殊图标。
这个方法也有一些不足:
-
不同的target,为了区分,有各自的info.plist文件,以及Build Settings等配置,如果需要更改,需要维护两次。不过,因为只是为了区分环境,绝大多数据的配置信息都是一样的。
-
为项目添加文件时,如果是共享的代码,需要同时关联两个Target。
将开发环境和生产环境分开为两个App
新建一个工程 MoreTargets,然后在Targets下,复制之前的 MoreTargets。
右键选择 Duplicate,会复制一个选中的Target,并为其创建了 MoreTargets copy-info.plist 文件。
更改信息
- 将复制的 MoreTargets 更名为 MoreTargetDev。
- MoreTargets copy-info.plist更名为 InfoDev(图中绿框),将其和Info.plist文件放在一起,方便以后更新。
- 重新配置 MoreTargetDev 的 Info.plist 文件。
- 增加一套开发环境App的图标。
- BundleId 后边添加 Dev 结尾标识。这样可以在一台 iPhone上,同时并存开发环境和生产环境的App。并为其设置App Icon Source。
- 选择 Manage Schemes,更改相应的Schemes名称。
点击名称,修改为 MoreTargetDev。
分别运行app,在模拟器中,可见有两个app了。
到此为止,我们已经把开发环境和生产环境分开为两个App了,并可同时存在于机器上。
代码中区分两个环境的App
首先是在 MoreTargetsDev 的 Build Settings 设置 开发的标识 DEVELOPMENT
。用于判断当前代码是什么环境。
其次,添加判断是否是开发的环境的代码。
import UIKit
enum Environment {
case production
case development
}
/// 全局变量,判断当前运行环境。
var currnt: Environment {
#if DEVELOPMENT
return .development
#else
return .production
#endif
}
class ViewController: UIViewController {
@IBOutlet weak var currentLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
switch currnt {
case .production:
currentLabel.text = "生产环境"
case .development:
currentLabel.text = "开发环境"
}
}
}
复制代码
运行代码,页面中间的Label可以与运行的app的环境一致。
最后
多Target 可用于解决开发中的多环境运行问题。只需要切换运行的Schemes,就可以直接切换环境,简单直接。
需要注意的一点,以后修改Info信息、以及配置信息,需要同时维护生产环境的配置。而且,如果添加文件时,如果是开发环境和生产环境共用的文件,需要同时关联两个Target。