工程管理篇 | APP环境分离的实现

前言

如何实现在同一台手机能同时安装同个应用的测试和生产版本?应用名称要有区分,图标也要有所区别。不要手动修改Bundle id和应用名称,也不要手动替换图标,更不要维护两个项目。如何才能简单地实现?

实现方案很简单,只要建立多个Target即可。当然,有些细节问题要注意,不然会出错。接下来,看如何一步步地实现环境分离。

复制Target

Target 是什么?

即是说,每个Target代表一个编译的产品。每个Target,可以有不同的编译源文件和资源文件。
那么,实现环境分离的方案,就是分别建立测试环境和生产环境的两个Target。
默认的Target作为生产环境的Target,在此基础上复制多一个Target作为测试环境的Target。
如下图,选择默认的Target,从右键菜单中选择Duplicate,就可以复制出一个新的Target了。
(1)新Target默认名称为 productname copy。复制完成后,
(2)不止是TARGETS列表中多出了名为 productname copy 的新Target,
     同时也会为该新Target生成名为 productname copy 的新的scheme,
(3)以及在项目的根目录下生成 productname copy-Info.plist 文件。

更名Target

不喜欢productname copy这样的名字,productnameBeta这样的名字才是测试版本该有的名字。那么,需要改名的地方有三处:target名称、scheme名称、plist文件名称。

(1)修改target名称很简单,只要在TARGETS列表中选中后,再点击一下即可编辑修改名称。
(2)修改scheme则可以在Xcode左上角的Run\Stop按钮右边的scheme列表菜单中选择Manage Schemes,打开弹出框,
    选中某个Scheme后,再点击一下即可编辑修改名称。
(3)plist文件的修改直接双击即可修改,修改为productnameBeta-Info.plist,同时,
    我还将其移到与默认的Info.plist文件在同个目录下。是在同一个物理目录下。
(4)改完plist文件后,还需要修改productnameBeta的Target的Info.plist File设置,
    该属性设置了相应Target绑定的plist文件是哪个。
    该属性值本来为productname copy-Info.plist,现需要更改为productname/productnameBeta-Info.plist。
  (注意这里的productname 是工程最外层文件夹的名称不是Target的名称也不是Scheme的名称。)

修改Target配置

接下来,就要修改Target的配置,实现真正的环境分离了。默认的productname的Target,作为生产版本,基本不需要改动,需要改的是作为测试版的productnameBeta。

新的Target可以修改的部分为:

(1)APP的名称
(2)APP的 Bundle id
(3)App Icons
(4)Launch Images
(5)info.plist文件

更换图标:默认会使用AppIcon这一项Assets,但AppIcon是给生产版设置的图标,既然测试版要使用不同图标,那就需要新建一套新的App Icon,如下图:

新建的App Icon将其命名为AppIcon-Beta,放置测试版的图标。并将productnameBeta的App Icons Source指定为新建的AppIcon-Beta。至此,图标也与生产版的有所区别了。

编程中如何判别不同的Target

那么,设置了不同Target后,代码上可能需要根据不同Target做不同处理,因此,需要在代码上能判断当前编译的是哪个Target。两种方式

(1)通过预编译宏来区分

例如,我们在 productnameBeta 的Build Settings中,
将 Preprocessor Macros 属性值设置为BETA,也就是为 productnameBeta 定义了一个预编译宏,宏名称为BETA。

然后,在代码中可以通过如下预编译指令判断当前是在哪个Target下:

#ifdef BETA
    // 测试版需要执行的代码
#else
    // 默认生产版需要执行的代码
#endif

(2)通过 info.plist文件配置。

  我们可以通过在每个 Target 对应的  info.plist中设置相同的 key来存储对应的值,
  然后写一套共用的通过取 info.plist文件里面的值来配置代码的逻辑

  + (NSString *)backBaiduMapAPPkey;
  {
      NSDictionary *infoDict = [[NSBundle mainBundle] infoDictionary];
      NSString *mapAppkey = infoDict[@"BaiDuMapAPPKEY"];
      return mapAppkey;
  }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

gRPC服务发现&负载均衡

构建高可用、高性能的通信服务,通常采用服务注册与发现、负载均衡和容错处理等机制实现。根据负载均衡实现所在的位置不同,通常可分为以下三种解决方案:

8272
来自专栏IT笔记

Linux下防火墙配置实例

操作系统centos centos7版本之前使用的是iptables,centos7版本之后变更为firewalld。 iptables配置实例 iptabl...

47710
来自专栏Keegan小钢

App环境分离的实现:iOS篇

说到App环境分离在iOS的实现,我曾在iOS技术群里问过:如何实现在同一台手机能同时安装同个应用的测试和生产版本?应用名称要有区分,图标也要有所区别。不要手动...

1293
来自专栏行者常至

数据库连接池简单连接

模型      -----     Model 视图      -----     View 控制器  -----     Controller

1003
来自专栏ionic3+

【技巧】ionic3视频上传

有人问到视频上传这个问题,那我还是写一下吧,其实基本参考《ionic3多文件上传》这文章也行,不过对于单文件上传就不用那么复杂了,步骤如下:

942
来自专栏追不上乌龟的兔子

[译]使用iptables控制网络流量

iptables是一个允许用户配置特定规则的应用程序,这些规则由将由内核netfilter框架强制执行。它充当数据包过滤器和防火墙,可根据端口,协议和其他标准检...

1.2K3
来自专栏AILearning

Apache Zeppelin 中 JDBC通用 解释器

概述 JDBC解释器允许您无缝地创建到任何数据源的JDBC连接。 在运行每个语句后,将立即应用插入,更新和升级。 到目前为止,已经通过以下测试: ...

3507
来自专栏

后端开源软件集合

缓存系统:memcached(group cache)、redis、mongodb、Couchbase(CouchDB、Membase、CouchOne) ht...

2619
来自专栏北京马哥教育

iptables练习

一、COMMAND 1、列出所有链的规则:iptables -L ,显示某条链的规则就是iptables -L INPUT ? 详细信息:iptables -...

3336
来自专栏大壮

iOS 自动打包 - fastlane

1 本文只是fastlane的基本使用. 2 使用fastlane前,确保你已经可以使用Xcode手动打包成功(说明你已经配置好证书)

2132

扫码关注云+社区

领取腾讯云代金券