iOS多个Target配置详情操作

  • 需求:当两个甚至两个以上的app存在小差异时,可以在一个工程(project)创建多个target每个target对应一个app。

  • 主要操作:共用文件时,用宏区别!但有些文件就共用就不方便,如Info.plist文件。不共用文件,就设置选择属于自己的Target

文件关联Target

左面板选中文件 ~> 显示右面板 ~> 选择右面板的下一栏“文件”图标(一般在最左边) ~> 可以看到箭头指向的Target Membership。打勾表示该文件属于哪些Target,勾选了多个Target,则该文件被多个Target使用。选中相应的Target然后在Build phase 搜索相应的文件并删除。如果添加的话。如下图:

Build Phase

Compile Sources 添加编译文件(".m" ".h" 或swift中的 ".swift:)
Copy Bundle Resources添加资源(除了了图中所示,一般就是图片等)


设置Target步骤:
1、创建Target
2、修改Target名称、Scheme名称
3、配置Info.plist
4、桥接文件设置
5、宏定义(Preprocessor Macros)设置
6、Assets。xcassets的设置(app图片、launch启动页)

创建 Target有两种方式:

  • 通过新建target可以通过File>New>Target,然后选择其中一个模板来创建,app类型的target,可以选择Empty Application模板,不过新建的target有自己的AppDelegate和main,但如何使其原来的AppDelegate和 main复用 (未找到相应资料)

  • 通过对原有的target做duplicate(duplicate only),复制一份。其好处:如果两个target的相同点很多,用duplicate,就可以把相关的设置全部拷贝过来,而不需要做 过多的修改,生成一个新的target。

复制原Target
  • 1. 复制工程中的其中一个Target(如果工程中有多个target、复制最相似的target,这样Info.plist文件的不需要过多修改)

工程中 target 与 工程名默认一样

复制Target

1、target上右键如图中所示点击Duplicate(复制),也可快捷键Command+D,弹出如下(如果项目中以有多个target,可以选中最相近target进行复制,这样可以减少相对少量的设置)

2、一般选中中间那个Duplicate Only(仅复制),默认选中是复制且过渡到iPad,看你需要进行选择, 本文现在只讲解仅复制。选中后如下图

3、会生成两个文件,其名称命名规则为被copy 的Target Name 再加上“ copy”(空格加copy)即TargetTest copy(target文件)、TargetTest copy-Info.plist(plist文件)。

2. 修改Target文件名称及与之对应的Scheme


如上图:1.修改后,点击其它文件,再切换回来(点击MyTargetTest),会发现2、3 显示名称、及Bundle Id也自动修改了。但4的该新Target对应的Scheme名没对应改过来,那就来修改它,然后点击Manage Schemes(管理所有Scheme),弹出下图

点中要修改的Scheme (此时左下角的“-”删除进入可选状态,即可对scheme进行删除),再左键单击,使其进入可编辑状态,即可进行修改(建议改成与相应target文件的名称,防止不必要的错误和麻烦)。修改完成后,点击close,相应的Scheme名称已修改完成。但bundleId 还是没修改


3、配置Info.plist

大致操作:修改名称后,需要Build Settings里修改Info.plist的路径,Bundle Id 、版本号等

配置Info.plist:操作a

文件路径在工程根目录下,如下图1

图1

照样选中plist文件,再单击文件名,文件名变成可编辑,进行修改(因为该.plist文件是相应target的Info.plist文件,建议其文件名为“相应target名”+“info”,建议先右键点击MyTargetTestInfo.plist点击Show in Finder进入其所在的文件夹,删除引用。然后在修改名称)。然后点回target文件选中MyTargetTest,会看到如下两图箭头所示


箭头所指的是当前target的Info.plist文件路径,但刚才咱们已经把那个文件名修改了,所以这边就无法找到相应的plist文件。那也先不急着改,建议,在工程里新加一个文件夹,如下图创建完成后。(作用:存放一些属于该Target的文件,便于管理。)


把刚才打开的文件夹找到文件,把它移动到MyTargetTest文件夹中,但在Xcode中找不到该文件(即Xcode中没该文件的引用 ),如何添加引用到Xcode上?有两种方法(哈哈,目前我只知道的):
步骤1、可以用Finder那边把MyTargetTestInfo.plist文件拖动到与Xcode对应的文件夹中(跟一般往Xcode拖入图片一样)。
步骤2、关闭Finder,到Xcode中到相应的MyTargetTestInfo.plist文件所在的文件夹上,右键点击并选中Add File to “Project Name”


方法1

我这边已添加过了,不然未添加的文件是正常状态,模糊表示该文件未被引用,然后选中未添加的文件,点击Add即可。[注意:已添加的文件千万别再添加,否则文件夹会无限创建(理论上),至把你它电脑的容量占满,兴趣的伙伴可以新工程试试(坏笑)]
对了,说要改其名字为有info的信息,所先删除引用,再修改文件名,然后再添加。

方法2、如下图,由于被我删除引用了,表示该文件没在Xcode,所以上图一个是模糊的(表示在文件夹中,且Xcode引用它),下图文件是正常状态(表示文件夹中有该文件,但未被Xcode引用 )



然后点击Add。Info.plist文件名修改完成。

配置Info.plist 操作b、由于相应target的关联的Info.plist文件名其及位置都修改了,所以需要重新关联。有两种方法(哈哈,目前只知道两种)

方法1、如下操作(project -> 相应target ->General -> Identity 点击 Choose Info.plist File...,找到相应的文件导入)

选择相应的info.plist文件

方法2、如下图操作(project -> 相应target -> Build Settings -> 搜索Info.plist -> 点击Info.plist左边value(路径))

然后输入相对路径$(SRCROOT)/MyTargetTest/MyTargetTestInfo.plist,当前事例所在的路径。 $(SRCROOT)/ ”获取工程文件所在的位置 + “/.../...plist,文件相对根目录所在的地址

配置完成后修改BudleId及版本号

修改自己想要的(建议跟target名一样)如下:
根据要求修改版本 Build号(在复制的时候这些跟原target一样)


4、桥接文件设置:

由于这是新建的测试项目好多配置文件没有,如下图没有桥接文件的路径!根据开发需求,可以共用,也可以自己创建,跟Info.plist创建一个,只是一个复制的时候创建下来了,原target有桥接文件,默认是共用。如需另一创建桥接文件,就把创建好的桥接文件路径写入,$(SRCROOT)/.../....pch。与info.plist一样方式设置。


5、宏定义(preprocessor macros)设置(Swift工程中设置Other Swift Flags,由于swift取消宏定义所以在macros那边设置无效 -- 有坑放置结束后提及):

由于多个target使用同个文件时,但又存在一定的差异,在代码中可以实现根据不同宏执行不一样的代码,使其区别target,如下操作4中

设置如下:
a、选中debug处,单击该行右边空白处,会弹窗,在点击窗口左下角的“+”添加新项,光标会移到3,输入自己需要的信息

b、release操作一样,如下图完成新Target的设置

target1设置APPTYPE=1

和target1 一样操作,如下图:操作1切换target,剩下操作同上

target2设置APPTYPE=0

代码中实现
根据宏值不一样 ,导入不一样的头文件

0表示target2 1表示target导入的文件

也可以这样设置宏。如图中1所指的遮住的地方是同样的字符

target2设置如下:

image28.png

Swift中操作 左键双击右侧值的地方,会弹出框进行值设置
两Target分别输入-D + "自己定义的名称"。

target1设置

target2设置

代码实现
1、正常的文件中(.h .m)直接用宏名去区别

2、在pch文件的使用 与在.m .h中没什么区别

Swift中实现

        #if APPTYPE1
            print("APP1")
        #elseif APPTYPE2
            print("APP2")
        #else
            print("APP -- 其它")
        #endif

6、Assets.xcassets的设置,一般设置app icon 以及 lanuch image的设置

要区别它俩可以新.xcassets 一个对应一个的.xcassets 或共用 同一个.xcassets

a、不共用

新建.xcassets文件 选中 点击“Next”



点击“Next” 弹出如下图
操作1 给文件命名,2选中你要设置的target 并点击创建“create”。



如下:里面没有其它文件,点击下方添加相应的icon 与 launch Image

如下图所示:操作1.“+”,操作2选中“App Icons & Launch Images”创建需要的文件



创建了两个文件,并拖入(导入需要的图片)

点击原.xcassets文件, 可以看到该文件包含着MyTargetTest 这个target,把勾选的按钮点击取消掉。这样两个target有对应的.xcassets文件了


选中project 查看target的状态,如下图:操作1 点击project文件“TargetTest”可以看到target那相应的图标都改变了,操作2“General”,看到App Icons and Launch Images


由于上上图的Assets.xcassets文件中没有launchImage文件。可看到3中的“Use Assets Catalog...”。所以去吧Assets.xcassets文件的launchImage补上


也可以在此处修改相应的图标 图片。

b、共用

好像只能区别Icon、 Lanuch,如果在.xcassets管理其它图片或相应的图片文件,目前找不到这些图片/文件如何区别target,建议使用多.xcassets文件在管理,这样它在编译的时候也不会编辑除自己有关的图片。如有其它方法在同一个.xcassets区别, 还望指教。谢谢

如下图我在里面创建了 icon、launchImage的各一对。且命名不一样


然后在target上 -> General -> App Icons and Launch Images 导入与之对应的上图的图片
target1的设置:如下

target2的设置:如下


这样就可以区别Icon 跟 Launch图片了


补5-Macros坑
Macros / Other Swift Flags添加“宏”(OC是宏 Swift是标志)。如果你的项目是混编,在OC文件中要用到Swift中的类等时,需要在oc文件上导入"工程名" -Swift.h 文件。而这个oc文件中区分Target时 就要根据macros,所以需要给相应的Target添加Macros从而区别Target
OC:

      #if APPTYPE == 0
      //相应操作
      #elif APPTYPE == 1
      //相应操作
      #else
      //相应操作
      #endif

Swift:

        #if APPTYPE1
            print("APP1")
        #elseif APPTYPE2
            print("APP2")
        #else
            print("APP -- 其它")
        #endif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 143,809评论 1 304
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 61,651评论 1 257
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 95,178评论 0 213
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 41,241评论 0 181
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 49,047评论 1 259
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 38,899评论 1 178
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 30,503评论 2 274
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,249评论 0 168
  • 想象着我的养父在大火中拼命挣扎,窒息,最后皮肤化为焦炭。我心中就已经是抑制不住地欢快,这就叫做以其人之道,还治其人...
    爱写小说的胖达阅读 29,125评论 6 235
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 32,605评论 0 213
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,368评论 2 215
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 30,723评论 1 232
  • 白月光回国,霸总把我这个替身辞退。还一脸阴沉的警告我。[不要出现在思思面前, 不然我有一百种方法让你生不如死。]我...
    爱写小说的胖达阅读 24,285评论 0 32
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,190评论 2 214
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 31,634评论 3 209
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,651评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,052评论 0 167
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 33,638评论 2 232
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 33,760评论 2 237

推荐阅读更多精彩内容