如何使相同的iOS Swift应用程序在代码和资产中只有一些差异,具有可扩展和干净的模式

6tdlim6h  于 2023-05-16  发布在  Swift
关注(0)|答案(3)|浏览(107)

我有这个需要。
我开发了一个应用程序,我想复制它。我可以复制和粘贴的项目,但如果我这样做10次可能是一个问题。问题是,如果我在第10个副本中发现了一个bug,我必须检查所有其他项目,而我不想这样做。
有一个干净的方法来解决这个问题吗?
换句话说,我只有一个大代码。我必须部署的应用程序之间的差异是:

  • 启动器图标
  • HTTP请求的域
  • 软件包名称
  • 闪屏
  • 应用程序名称
  • 应用程序内部的一些整数
  • 一些资产

在Android中,我用gradle来做这件事,特别是用flavors。如何使用Swift做同样的事情?

mo49yndu

mo49yndu1#

创建具有多个目标的单个项目。每个目标都有一个不同的info.plist和您需要的任何其他更改,但是共享源。

编辑:

有一个名为xcodegen的开源工具,它允许您使用yaml(.yml)文件定义项目。然后运行xcodegen脚本,它将创建包含所有不同目标和依赖项的项目文件。这可能是构建包含相同源和构建规则但不同资产的多个目标的更简洁的方法。

nfs0ujit

nfs0ujit2#

我会用Git来做:
在您的 origin 存储库中,使用占位符准备您的项目:

  • 尝试创建一个文件,在其中定义域的常量,你提到的整数等。这个文件可以称为Constants.swift
  • 将您需要更改的所有资产放在一个.xcassets中。(与保持不变的资产不同)例如图标。你已经可以添加你想在你的应用程序中拥有的图像集,但是把它们留空(或者添加占位符图像)
  • 为应用程序名称和软件包名称编写占位符
  • 创建一个默认的启动画面(我猜你是指启动画面)。这可以是空的,或者如果你想让它在所有的应用程序中都是相似的,请稍微准备一下,这样你就不必为每个应用程序做太多的更改

提交并推送主项目后,为每个应用创建 forks。在分叉中,您可以更改已准备作为占位符的所有内容。
如果在某个地方有一个但是,将其固定在 origin 中。然后你就可以很容易地将更改合并到你的每一个分支中。

t2a7ltrp

t2a7ltrp3#

下面是我的设置:

(1)新建一个Framework类型的项目。

将所有共享代码-扩展、子类、图像资源,甚至.xib文件-移动到this项目中。我创建了一个App/Bundle ID(“com.company.framework”),但我不确定是否需要提交App Store。此外,勾选“仅允许应用程序扩展API”将删除您将收到的警告。
对于像图像或文本文件这样的文件,创建bundle并将bundle拖到框架中。我发现你可以通过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)创建第二个项目,这次是针对您的特定应用。

假设你把你的框架称为“内核”。所有公开声明的代码都可以通过添加:

import Kernel

现在,这里是最好的部分(对我来说):有两种方法可以使用此设置。
(3a)将framework .xcodeproj拖到应用项目中。
优点:你可以(a)对你的框架源代码进行修改,(B)同时构建这两个框架。
缺点:一次只能打开一个app项目,因为Xcode会检测到框架项目已打开。
(3b)将Kernel.framework项目拖到应用程序项目中。
优点:您可以一次打开所有应用程序。
缺点:你需要(a)在它的项目中修改你的框架源代码,并且-我认为-(B)用重建的框架手动更新每个应用程序。
我说“我认为”是因为我使用了前一种设置。一次只打开一个应用程序,这是一个很小的代价。通常情况下,如果你正在做一个框架的变化,它是一个单一的应用程序。
最终注解:

  • 在“应用#1”中工作时对框架所做的更改将在您打开“应用#2”时被拾取。
  • 我有单独的Git存储库(a)每个应用程序和(B)我的框架,本地和GitHub上都有。完美的工作。
  • 我为(a)每个应用程序和(b)开发者门户中的框架设置了单独的捆绑包/应用程序ID(和版本)。
  • 到了App Store提交时间,我将应用程序存档并上传。框架是为了搭便车沿着的。

相关问题