如何制作相同的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提交时间,我将应用程序归档并上传。 框架随之而来。