如何制作相同的iOS Swift应用程序,只需要在代码和资源方面有一些区别,可扩展的和干净的模式
我有这个需求。
我开发了一个应用程序,我想复制它。 我可以复制和粘贴项目,但如果我这样做10次可能是一个问题。 问题是,如果我在第10个重复中发现一个错误,我必须检查所有其他项目,我不想这样做。
有一个干净的方法来解决这个问题?
换句话说,我只有一个大代码。 我必须部署的应用程序之间的差异是:
- 启动器图标
- HTTP请求的域
- 包裹名字
- 初始屏幕
- 应用名称
- 应用程序内的一些整数
- 一些资产
在Android中,我用gradle来做这个,特别是用这个风格。 我怎样才能做到这一点与斯威夫特?
创build一个包含多个目标的项目。 每个目标都会有一个不同的info.plist,不pipe你需要什么其他的改变,但是共享的来源。
我会用Git来做到这一点:
在您的源代码库中,使用占位符准备您的项目:
-
尝试创build一个文件,在其中为域定义常量,您提到的整数等等。您可以调用
Constants.swift
文件。 -
将所有需要更改的资源放在一个
.xcassets
。 (与保持不变的资产不同)例如Icon。 您可以添加应用中想要的图像集,但将其保留为空(或者添加占位符图像) -
为应用程序名称和包名写一个占位符
-
创build一个默认的启animation面(我猜你的意思是启animation面)。 这可能是空的,或者如果您希望它在所有应用程序中都相似,请稍微准备一下,这样您就不必为每个应用程序改变太多
当您承诺并推送您的主项目时,为您的每个应用程序创build分支 。 在叉子里,你可以改变你准备好的所有东西。
如果有,但在某个地方,将其固定在原点 。 然后,您可以轻松地将更改合并到每个叉子。
这是我的设置:
(1)创build一个types为Framework的新项目。
将所有共享代码 – 扩展名,子类,图像资产,甚至.xib文件 – 移动到此项目中。 我创build了一个App / Bundle ID(“com.company.framework”),但我不确定是否需要App Store提交。 另外,勾选“仅允许应用扩展程序API”将会删除您将得到的警告。
对于像图像或文本文件这样的文件,创build包并将包拖入框架。 我发现你可以通过Xcode添加新的图像/文件。 要检索它们,代码如下:
public func returnKernel(_ named:String) -> String { let myBundle = Bundle.init(identifier: "com.company.framework") let kernelPath = (myBundle?.path(forResource: "cikernels", ofType: "bundle"))! + "/" + named + ".cikernel" do { return try String(contentsOfFile: kernelPath) } catch let error as NSError { return error.description } }
(2)创build第二个项目,这次是为您的特定应用程序。
比方说,你叫你的框架“内核”。 所有公开声明的代码都可以通过添加:
import Kernel
现在,这里是最好的部分(对我来说):你有两种方法来处理这个设置。
(3a)将您的框架.xcodeproj拖到您的应用程序项目中。
优点:您可以(a)对框架源代码进行更改,并(b)一次性构build。
CON:一次只能打开一个应用程序项目,因为Xcode检测到框架项目已经打开。
(3b)将Kernel.framework项目拖到你的应用程序项目中。
专业版:你可以让所有的应用程序一次打开。
CONS:您将需要(a)在您的项目中更改框架源代码,并且 – 我认为 – (b)使用重build框架手动更新每个应用程序。
我说“我想”是因为我用前者设置。 一次打开一个应用程序是一个小的代价。 通常情况下,如果你正在改变一个框架,它只适用于一个应用程序。
最终注意事项:
-
当您打开“应用程序#2”时,在“应用程序#1”中进行的对框架所做的更改将被选中。
-
我有单独的Git仓库(a)每个应用程序和(b)我的框架,本地和GitHub。 完美的作品。
-
我已经为(a)每个应用程序和(b)Developer Portal中的框架分别设置了Bundle / App ID(和版本)。
-
快来App Store提交时间,我将应用程序归档并上传。 框架随之而来。