背景介绍

  • 开发过程中,我们会在内网搭建一个测试服务器,开发、测试都是在内网进行的。这样产生脏数据不会影响外网的服务器。外网服务器只有最后发布时才会进行一些必要的测试。
  • 还有就是要对同一份代码生成不同的product,比如一个游戏有100关,要生成一个免费版(只有20关),可以新建一个Target,设置参数就可以实现,如果通过代码来控制就太麻烦了。

怎么办

  • 针对第一个问题,在代码级别,对这个URL的选择,可以使用简单一点的宏来判断。这样所有的请求只要都调用这个宏,就可以做到控制。但是这样写不少限制,那就是很多工程属性不能设置,比如不能改变Bundle ID,不能改启动图片,不能改应用名称等。这样的测试版和正式版不能同时安装到同一部手机上,这样测试起来很麻烦,很多情况下我们需要对比正式版和测试版。
#ifndef DEBUG
#define BaseURL @"192.168.1.23" // 内网服务器
#else
#define BaseURL @"112.23.12.34" // 外网服务器(瞎写的)
#endif
  • 如果对于上一种方式不满,接下来可以使用更加强大的Targets

    • Targets 可以使用更多高级功能,比如一个Target对应一个Info.plist
    • Info.plist中可以修改的属性太多了,什么启动图片,Bundle IdMain Interface等小改动
    • 大的改动,可以修改Bulid Phases,设置文件的编译,静态库的链接
    • 还可以修改Bulid Settings 设置工程的编译、链接属性
    • 选择不同的证书,开发环境就开发证书,发布时就选发布证书
  • 第二个问题也可以用Targets来实现,当然通过代码也可以控制,但是代码的话扩展性太差。

Targets操作

复制 Targets

  • 新建Xcode时会自动创建一个默认的Target,我们如果要自己新增的话,可以通过复制的方式快捷创建第二个。
  • 复制会将已有的资源以及工程属性copy一份,在这个基础上进行更改即可。
  • 可以看到工程目录中多了一个文件Xcode的开发版 copy-Info.plist,就是这个新文件,所有的配置都可以在这里进行配置

创建全新Targets

  • 可用通过菜单Editor->Add Target-> Application -> Singe View Application -> Product Name 来新增

Targets之间异同

  • 一个Target包含了Copy Bundle Resources, Compile Sources, Link Binary With Librariesinfo.plist

    • Copy Bundle Resources 是指生成的product的.app内将包含哪些资源文件
    • Compile Sources 是指将有哪些源代码被编译
    • Link Binary With Libraries 是指编译过程中会引用哪些库文件
    • 最关键的就是info.plist文件,iPhone项目的很多关键性内容, 比如程序名称, 最终生成product的全局唯一id等都可用info.plist来设置。
    • 不同的target还可以定义完整的差异化的编译设置, 从简单的调整优化选项, 到增加条件编译所使用的编译条件, 以至于所使用的base SDK都可以差异化指定

注意事项

  • 新增文件、资源等,如果有多个Target,添加新文件时要注意勾选多个Target
  • 修改新文件Xcode的开发版 copy-Info.plist
    • 首先,修改Target名称
    • 然后,修改plist名称
    • 最后,修改schemes
  • 设置预编译宏
    • Target 开发版->Build Settings 然后搜索Preprocessor Macros 然后增加宏
    • 测试一下,可用通过预编译宏来区别代码

   if (DevelopMent == 1) { // 测试一下,选择不同的Schemes就可以看到输出不同
        NSLog(@"DevelopMent=1");
    }else {
        NSLog(@"DevelopMent=0");
    }
  • 修改Bundle Identifier和选择不同的证书,让app区分开来

    • 点击target: Xcode的测试版->Summary:提示你需要选择plist文件,选择1)中添加的Xcode的测试版.plist
    • 点击target: Xcode的开发版 ->Summary:设置Bundle Idenfitier
    • 点击target: Xcode的测试版->Build Settings->Code Signing:选择另外的证书;

结语

  • 现在就可以针对不同的product设置不同的参数了,生成不同的app那都不是事儿。
  • 在代码中通过预编译宏做出区分,然后安心开发app吧
#if DevelopMent == 1
#define BaseURL @"192.168.1.23" // 内网服务器
#else
#define BaseURL @"112.23.12.34" // 外网服务器(瞎写的)
#endif

多个Target的使用的更多相关文章

  1. MySQL中You can't specify target table for update in FROM clause一场

    mysql中You can't specify target table <tbl> for update in FROM clause错误的意思是说,不能先select出同一表中的某些值 ...

  2. jQuery之常用且重要方法梳理(target,arguments,slice,substring,data,trigger,Attr)-(一)

    1.jquery  data(name) data() 方法向被选元素附加数据,或者从被选元素获取数据. $("#btn1").click(function(){ $(" ...

  3. ASP.NET 5 Target framework dnx451 and dnxcore50

    中文不知如何定义标题,所以干脆就直接贴出关键字,在 ASP.NET 5 项目的 project.json 配置文件中,会有这样的定义: "frameworks": { " ...

  4. minSdkVersion maxSdkVersion targetSdkVersion target 的区别

    minSdkVersion 描述:app最低支持的sdk版本号 作用:如果手机SdkVersion小于app中定义的minSdkVersion,则android系统不允许安装该app 定义位置:And ...

  5. MDK st-link下载STM32程序出现Internal command error和Error:Flash download failed. Target DLL

    MDK st-link下载STM32程序出现Internal command error和Error:Flash download failed. Target DLL   是因为目标板的芯片处于休眠 ...

  6. jBPM4.4 no jBPM DB schema: no JBPM4_EXECUTION table. Run the create.jbpm.schema target first in the install tool.

    jBPM4.4 no jBPM DB schema: no JBPM4_EXECUTION table. Run the create.jbpm.schema target first in the ...

  7. mysql-You can’t specify target table for update in FROM clause错误

    mysql中You can't specify target table for update in FROM clause错误的意思是说,不能先select出同一表中的某些值,再update这个表( ...

  8. podfile The dependency `` is not used in any concrete target

    内容提要: podfile升级之后到最新版本,pod里的内容必须明确指出所用第三方库的target,否则会出现The dependency `` is not used in any concrete ...

  9. HTML <a> 标签的 target 属性

    HTML <a> 标签的 target 属性 HTML <a> 标签 定义和用法 <a> 标签的 target 属性规定在何处打开链接文档. 如果在一个 <a ...

  10. window.event.srcElement与window.event.target 触发事件的元素

    IE浏览器支持window.event.srcElement , 而firefox支持window.event.target:<input type="text" onblu ...

随机推荐

  1. 【[TJOI2007]可爱的质数】

    题目 用一道板子题来复习一下\(bsgs\) \(bsgs\)用于求解形如 \[a^x\equiv b(mod\ p)\] 这样的高次不定方程 由于费马小定理的存在,我们可是直接暴力扫一遍\(p\), ...

  2. listBox获取项的方法

    获取所有项 ; i < LB.Items.Count;i++ )2 {3 str_arr.Add(LB.Items[i].ToString()); 4 } 获取指定项 string str=LB ...

  3. Ubuntu连接上海大学校园网(ShuWlan-1x & Shu(For All))

    1.连接Shu(For All):直接连接,打开网页后可能会自动弹出登录页面,也可能需要点击浏览器菜单栏下方的跳转按钮. 2.连接ShuWlan-1x配置注意点: 认证方式:Protected EAP ...

  4. Android学习笔记_24_多媒体MediaPlayer对象之音乐播放器与SoundPool声音池

    一.MediaPlayer对象常用方法介绍: MediaPlayer mediaPlayer = new MediaPlayer(); if (mediaPlayer.isPlaying()) { m ...

  5. 读取静态的json文件

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  6. GPU卡掉卡

    这几天用GPU卡跑东西,老是提示opencv的一个问题.但是我换个数据跑就没问题.说明代码是没问题的.发挥我作为女人的特质,从起试试吧.结果从起后找不到GPU卡了.nvidia-smi提示我没有安装最 ...

  7. Java基础——数组复习

    数组是一个变量,存储相同数据类型的一组数据 声明一个变量就是在内存空间划出一块合适的空间 声明一个数组就是在内存空间划出一串连续的空间 数组长度固定不变,避免数组越界   数组是静态分配内存空间的,所 ...

  8. Oracle-01-数据库分类/oracle sql*plus常用命令

    一.数据库分类 一.数据库分类1.小型数据库:access.foxbase2.中型数据库:informix.sql server.mysql3.大型数据库:sybase.db2.oracle 二.项目 ...

  9. SQL3120W 不能将xx的字段值转换成 INTEGER值

    一次用DB2 Load/Import导入数据时,报错,提示SQL3120W 不能将xx的字段值转换成 INTEGER值,但目标列不可为空.未装入该行. 目标表: CREATE TABLE TEST( ...

  10. ABAP术语-Function Library

    Function Library 原文:http://www.cnblogs.com/qiangsheng/archive/2008/02/14/1068642.html Central reposi ...