iOS 新建Target实现同一份代码编译多个定制app

新建多个Target

一, 新建多个Target的用途

公司的一个新需求,需要在原有的企业版app基础上,新做一个用户版的app。由于两个app大部分内容很相似,而且有一个共用的业务模块。
大概情况如上,而痛点如下:

  • 虽然大部分内容一开始相同,但后面分歧会越来越大,毕竟是两个app,各有各的业务,所以这大部分相同的代码,将会被拷贝成两份代码。
  • 共用一个业务模块。在第1个痛点的时候,我们已经把不共用的代码拷贝成两份了,如果共用模块也拷贝两份代码的话,那以后共用模块出现修改的话,就需要在共用模块的两份代码都修改一遍,容易出错。
  • 共用模块也会出现小部分的两个app不同的业务处理。

针对以上三个痛点,新建一个target正好可以解决这几个问题。

二, 新建Target的方法

方法一:复制target

在已有的target上,已有target–>右键–>Duplicaate–>Duplicaate Only。
在这里插入图片描述
复制成功后,工程目录下会出现copy-Info.plist文件。此方式新建的新target保留了被拷贝的target全部配置和文件引用,只需稍作修改就能生成一个新的app(比如修改包名、图标和启动图之类的)。

方法二:新建target

通过菜单–>Editor–>Add Target–> Application --> Singe View Application --> Product Name

在这里插入图片描述

新建成功后,工程目录会出现新target目录,里面会包含以下文件
在这里插入图片描述
此方法新建的新target将不保留被拷贝的target全部配置和文件引用,相当于一个全新的app(Singe View Application)。

三、不同的target作用

每个Target都包含了Copy Bundle Resources, Compile Sources, Link Binary With Libraries、info.plist等,对不同的app进行管理。
不同target对应的资源文件

其作用如下:

  • Copy Bundle Resources 是指生成app后里面所包含的资源文件,比如图片。

  • Compile Sources 是指哪些源代码会被该target引用编译。

  • Link Binary With Libraries 是指引用哪些库文件。

  • info.plist,这个应该都是知道是比较重要的,比如包名、版本号和权限之类的。

四、通过创建新Target来实现同一份代码克隆出多个定制版本app

使用 copy target方式克隆

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

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

在这里插入图片描述

一个新工程默认target名与工程名一样
对原target(如果项目中以有多个target,可以选中最相近target进行复制,这样可以减少相对少量的设置)上右键如下图所示

在这里插入图片描述

点击Duplicate(复制),也可快捷键Command+D,弹出如下
在这里插入图片描述

一般选中中间那个Duplicate Only(仅复制),默认选中是复制且过渡到iPad,看你需要进行选择, 本文现在只讲解仅复制。选中后如下图
在这里插入图片描述
会生成两个文件,其名称命名规则为被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 、版本号等

a、具体如下:

文件路径在工程根目录下,如下图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”, 会弹出如下窗口

在这里插入图片描述

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

在这里插入图片描述

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

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

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

在这里插入图片描述

在这里插入图片描述

2.如下图操作(project -> 相应target -> Build Settings -> 搜索Info.plist -> 点击Info.plist左边value(路径))
在这里插入图片描述

然后输入相对路径 ( S R C R O O T ) / M y T a r g e t T e s t / M y T a r g e t T e s t I n f o . p l i s t , 当 前 事 例 所 在 的 路 径 。 “ (SRCROOT)/MyTargetTest/MyTargetTestInfo.plist ,当前事例所在的路径。 “ (SRCROOT)/MyTargetTest/MyTargetTestInfo.plist(SRCROOT)/ ”获取工程文件所在的位置 + “/…/…plist”,文件相对根目录所在的地址

c、修改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的设置

在这里插入图片描述
原target也一样操作,如下图:操作1切换target,剩下操作同上
在这里插入图片描述

代码中实现–eg:
根据宏值不一样 ,导入不一样的头文件
在这里插入图片描述
也可以这样设置宏1中遮住的地方是同样的字符
在这里插入图片描述

另一个target设置如下:
在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

代码实现如下:
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

使用 新建target方式克隆

通过新建target可以通过File–>New–>Target,然后选择其中一个模板来创建,app类型的target,可以选择Empty Application模板,不过新建的target有自己的AppDelegate和main

1、使用方法二新建target
2、新建一个共用模块文件夹
在这里插入图片描述
3、把需要共用模块的代码(看你的需要),拷贝到CommonModule的finder目录下。
在这里插入图片描述

4、在工程中目录中,彻底删除原target中共用模块代码。(Move to Trash)
5、再把这些共用模块代码拉到CommonModule工程目录下,Add to选中: 原target+新target
在这里插入图片描述

6、在工程中目录中,彻底删除新target里的所有东西
首先,彻底删除掉这几个文件:在这里插入图片描述
7、把原target的finder目录下所有文件,拷贝到新target的finder目录下。
8、把新target的finder目录下所有文件,拉到新target的工程目录下。Add to选中:新target
在这里插入图片描述

9、至此,新建target的前期工作就完成了,剩下的改配置、修复报错和修复引用之类的了。

10、修改新target的配置
在这里插入图片描述

设置编译宏来区别代码,分别在新旧两个target的Build Settings中搜索Preprocessor Macros然后增加宏(这里用IsUserTarget=1)在这里插入图片描述

五、不同的target的info.plist文件配置

设置步骤:
1、创建Target
2、修改Target名称、Scheme名称
3、配置Info.plist
4、桥接文件设置
5、宏定义(Preprocessor Macros)设置
6、Assets。xcassets的设置(app图片、launch启动页)
默认plist文件在project下面,如果你想修改路径可以Remove Reference,然后挪到比如说Supporting Files下,然后再Add进来在这里插入图片描述

然后在点到target–>General–>Choose Info.plist File

在这里插入图片描述

刷新后修改Display Name 以及 Bundle Identifier

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS记账App开发可以采用小歆记账AUI项目作为参考。小歆记账AUI是一个基于APICloud AUI的记账应用,适用于iOS平台。该应用可以通过APICloud提供的前端框架AUI进行开发,并利用APICloud的逻辑处理和云编译功能。 在小歆记账AUI项目中,数据存储部分是在服务端,与小歆记账WebApp项目共用数据库。通过Ajax与小歆记账WebApp后台进行通信,实现数据的同步和更新。 在具体的iOS记账App开发中,可以参考小歆记账AUI项目的功能和界面设计,根据需求进行定制化开发。可以使用iOS开发技术,如Objective-C或Swift,来实现记账功能、账本管理以及数据存储等功能。可以使用iOS提供的界面组件和API来构建用户界面,并与后端进行数据交互。 在数据存储方面,可以设计账本表(Book)来管理账本信息,其中包括账本ID(bookID)和账本名(name)等字段。通过对账本表的操作,实现账本的增删改查等功能。可以使用Core Data或其他数据库技术来进行数据的存储和管理。 总结来说,iOS记账App开发可以参考小歆记账AUI项目,利用APICloud提供的前端框架AUI和后端通信功能,通过iOS开发技术实现记账功能和数据存储。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [小歆记账AUI项目(APICloud客户端)](https://blog.csdn.net/zhangzejin3883/article/details/108904157)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [【iOS】基于Realm数据库的记账软件--Realm数据库(一)](https://blog.csdn.net/Bloody_Leaves/article/details/74937708)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值