codeiOS语法技巧iOS && Android

规避低级错误!使用不同TARGET区分线上与线下接口环境

2016-02-05  本文已影响722人  Jason_Hu

最近犯了一个严重的低级错误,把线下接口环境的包传到了AppStore还一直没察觉,审核通过并上线后好多天才发现。只好下架app、再提一版、申请加急。在群里面一说,还真有好多童鞋犯过跟我一样的错误。
为了避免这种低级错误的再次发生,决定用下面的方案,用TARGETS将线上线下的包彻底分开。

解决方案:

创建两个新的Target:
一个测试版 - 测试环境,更改BundleID、icon、display name,Other C Flags中单独配置宏定义(从而可以判断是否使用测试接口)
一个线上版 - 只有BundleID和display name与原版不同

预期效果:

  1. 各个target的BundleID不同,即使失误打包上传了错误的版本包,在iTunes Connect中也不会显示。

  2. 各个target的BundleID不同,测试版和线上版都可以与商店版app同时安装,不会覆盖。迭代中不论测试线上还是线下数据时,都不会影响手机中的商店版本。

  3. 测试版的icon和display name与商店版不同,不易混淆

  4. 缺点一-各个target的BundleID不同,推送证书也就不同,在调试推送相关功能点时,还是会有些麻烦。

  5. 缺点二-通过URLScheme执行app间跳转时,如三方登录、三方支付、分享等,回调跳转会出现问题,解决起来很麻烦。

0. 前提


此前区分线上线下环境只用了一个代码定义的宏定义
通过控制USING_DEV_SERVER 来切换环境
<pre>// 线上线下接口开关
#define USING_DEV_SERVER 1
</pre>

<pre>
#ifdef USING_DEV_SERVER
// development
#define SERVER_IP @"xx.xxxxx.com"
#define RESOURCE_IP @"res.xxxxx.com"

#else
// online
#define SERVER_IP @"xx.yyyyy.com"
#define RESOURCE_IP @"res.yyyyy.com"

endif

</pre>

<pre>
#ifdef USING_DEV_SERVER
[self autoFill];

[self.view makeToast:@"当前为测试环境,不发短信,验证码已自动填充" duration:MAXFLOAT position:CSToastPositionCenter];

#endif
</pre>

1. 具体步骤


创建新的TARGET


信息修改

改一下两个新Target的名字



改一下Scheme名




改一下BundleID

改一下Display Name和测试版的icon,这两步就不贴图了。

为测试版配置Flag***

这里设置-DTARGET_DEV,相当于宏定义了TARGET_DEV = 1


上一步配置完后,就可以通过TARGET_DEV来区分是否是测试版了

将之前的这部分代码(见上文 "0.前提" ,一节)
<pre>// 线上线下接口开关
#define USING_DEV_SERVER
</pre>
修改为
<pre>
// 线上线下接口开关
#ifdef TARGET_DEV
#define USING_DEV_SERVER 1
#endif
</pre>
这样,在测试版中就会使用测试环境,而其他版本中会使用线上环境。

切换TARGET

最后,想要编译、运行、打包时切换不同TARGET时,在这里切换就可以了。


参考


猿题库iOS客户端的技术细节(一):使用多target来构建大量相似App
http://blog.devtang.com/blog/2013/10/17/the-tech-detail-of-ape-client-1/

XCode工程中关于Targets的介绍
http://blog.csdn.net/yongyinmg/article/details/23695999

上一篇下一篇

猜你喜欢

热点阅读