iOS开发中的多Target区分运行环境

2,114 阅读3分钟

多Target解决开发和生产环境区分问题

最近一段时间,遇到一个区分生产和开发环境的问题。

现有的解决方案,在代码中使用了全局变量,对于环境的区分,都依赖于这个全局变量。

每次测试和App打包发布 App Store,必须要记得更改代码中的环境配置代码。这就会到导致一些问题,比如,打包时,忘记了将环境配置代码更改为生产环境,导致线上发布的App变成开发版本,后果很严重。

经过一番查找,参考网上的一些解决方法,于是采用多Target来区分App的运行环境。

一些优点:

  1. 避免每次打包都要手动更改代码,现在使用Schemes进行区分。
  2. 在测试的机器上,可将开发和生产的App区分开,为测试版提供特殊图标。

这个方法也有一些不足:

  1. 不同的target,为了区分,有各自的info.plist文件,以及Build Settings等配置,如果需要更改,需要维护两次。不过,因为只是为了区分环境,绝大多数据的配置信息都是一样的。

  2. 为项目添加文件时,如果是共享的代码,需要同时关联两个Target。

将开发环境和生产环境分开为两个App

新建一个工程 MoreTargets,然后在Targets下,复制之前的 MoreTargets。

20210820111622.jpg

右键选择 Duplicate,会复制一个选中的Target,并为其创建了 MoreTargets copy-info.plist 文件。

20210820111801.jpg

更改信息

  1. 将复制的 MoreTargets 更名为 MoreTargetDev。
  2. MoreTargets copy-info.plist更名为 InfoDev(图中绿框),将其和Info.plist文件放在一起,方便以后更新。
  3. 重新配置 MoreTargetDev 的 Info.plist 文件。

20210820172120.jpg

  1. 增加一套开发环境App的图标。

20210820120821.jpg

  1. BundleId 后边添加 Dev 结尾标识。这样可以在一台 iPhone上,同时并存开发环境和生产环境的App。并为其设置App Icon Source。

20210820114744.jpg

  1. 选择 Manage Schemes,更改相应的Schemes名称。

20210820141511.jpg

点击名称,修改为 MoreTargetDev。

20210820142142.jpg

分别运行app,在模拟器中,可见有两个app了。

20210820143119.jpg

到此为止,我们已经把开发环境和生产环境分开为两个App了,并可同时存在于机器上。

代码中区分两个环境的App

首先是在 MoreTargetsDev 的 Build Settings 设置 开发的标识 DEVELOPMENT。用于判断当前代码是什么环境。

20210820152536.jpg

其次,添加判断是否是开发的环境的代码。

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的环境一致。

20210820152258.jpg

20210820145920.jpg

最后

多Target 可用于解决开发中的多环境运行问题。只需要切换运行的Schemes,就可以直接切换环境,简单直接。

需要注意的一点,以后修改Info信息、以及配置信息,需要同时维护生产环境的配置。而且,如果添加文件时,如果是开发环境和生产环境共用的文件,需要同时关联两个Target。

问题与解决

如果存在OC与Swift混用,在开发环境,可能会有<Product Name>-Swift.h不存在的错误。

解决方法:在出现问题的Target中,Build Setting -> Packaging -> Product Name对应的值,改为和生产相同的配置即可。 参考:OC与swift混编 #import "项目名-Swift.h"失效问题