iOS 中的依赖管理
Dependency managment in iOS
所以,我有以下场景:
我正在开发一个供不同公司使用的 iOS 应用程序。
每个公司都有一些差异:
- 应用程序图标
- 主题颜色
- 图片(例如,公司徽标)
- 字符串(例如,公司名称)
最好的方法是编写单个代码,然后为每个应用程序覆盖一些值和资产。
在 Android 中,我可以通过覆盖资源为每个公司创建一个库模块(具有应用程序的核心)和一个应用程序模块(没有 Java 代码)来轻松实现这一点。
我正在尝试在 XCode 上开发相同的结构,但我不清楚实现方法。
经过简短的研究,我考虑了一些选项:框架、静态库和子项目。
哪种方法是正确的?我应该考虑使用 Dependency/Package 管理器(例如 Swift 包管理器、CocoaPods 或 Carthage)吗?
这些包管理器是 git 依赖的?因为我正在使用 SVN,切换到 Git 在这一点上是不可行的。
项目设置:
XCode 9
Swift 4
我推荐你使用目标。
让我向您展示我如何使用 assets
/ settings
.
处理此层次结构
资产
我的Assets
目录
- 常用文件夹包含常用的
images
- Company1 文件夹 包含
images
/ colors
/ certificates
您必须通过仅选择它确实需要引用的目标来更改 Company1 > Images
的 Target Membership
。
例如common > Assets
需要引用所有targets
.
代码
如果您需要在每个目标中做一些不同的事情,您可以对您的代码执行相同的操作。
就个人而言,我使用 extension
的强大功能将代码拆分到不同的源文件中,以便能够引用不同的目标。
将此文件引用到 Company1
目标
extension FirstViewController {
func doSomething() {
// implement this method for the company 1
}
}
将此文件引用到 Company2
目标
extension FirstViewController {
func doSomething() {
// implement this method for the company 2
}
}
将此文件引用给所有 targets
class LandingEmptyViewController {
func foobar() {
self.doSomething()
}
}
您还可以在 Build Settings
中为每个目标传递一些 flags
使用这些解决方案,您将能够在 Android.
中执行相同的操作
您可以使用 静态框架 来开发此类项目。现在,静态框架有其自身的起伏。
https://www.raywenderlich.com/65964/create-a-framework-for-ios
- 为所有通用 类 创建一个核心模块框架,将作为 Company1Extension、Company2Extension 为不同的应用程序共享。
- 现在通过创建各自的工作区将这个核心模块框架包含到各个项目中。
- 各个扩展项目将拥有自己的资产、应用程序图标、应用程序名称。
- 请注意,此方法的缺点之一是您不能在其中包含 pods。您必须为任何第三方库选择 Carthage 或 Git 子模块。
- 这种方法的优点之一是您可以通过指定要扩展到扩展的功能或类来维护核心模块的代码安全。
注意:在应用发布期间,请不要忘记确保 ipa 文件的有效负载结构正确。
所以,我有以下场景:
我正在开发一个供不同公司使用的 iOS 应用程序。 每个公司都有一些差异:
- 应用程序图标
- 主题颜色
- 图片(例如,公司徽标)
- 字符串(例如,公司名称)
最好的方法是编写单个代码,然后为每个应用程序覆盖一些值和资产。
在 Android 中,我可以通过覆盖资源为每个公司创建一个库模块(具有应用程序的核心)和一个应用程序模块(没有 Java 代码)来轻松实现这一点。
我正在尝试在 XCode 上开发相同的结构,但我不清楚实现方法。 经过简短的研究,我考虑了一些选项:框架、静态库和子项目。
哪种方法是正确的?我应该考虑使用 Dependency/Package 管理器(例如 Swift 包管理器、CocoaPods 或 Carthage)吗?
这些包管理器是 git 依赖的?因为我正在使用 SVN,切换到 Git 在这一点上是不可行的。
项目设置:
XCode 9
Swift 4
我推荐你使用目标。
让我向您展示我如何使用 assets
/ settings
.
资产
我的Assets
目录
- 常用文件夹包含常用的
images
- Company1 文件夹 包含
images
/colors
/certificates
您必须通过仅选择它确实需要引用的目标来更改 Company1 > Images
的 Target Membership
。
例如common > Assets
需要引用所有targets
.
代码
如果您需要在每个目标中做一些不同的事情,您可以对您的代码执行相同的操作。
就个人而言,我使用 extension
的强大功能将代码拆分到不同的源文件中,以便能够引用不同的目标。
将此文件引用到 Company1
目标
extension FirstViewController {
func doSomething() {
// implement this method for the company 1
}
}
将此文件引用到 Company2
目标
extension FirstViewController {
func doSomething() {
// implement this method for the company 2
}
}
将此文件引用给所有 targets
class LandingEmptyViewController {
func foobar() {
self.doSomething()
}
}
您还可以在 Build Settings
flags
使用这些解决方案,您将能够在 Android.
中执行相同的操作您可以使用 静态框架 来开发此类项目。现在,静态框架有其自身的起伏。
https://www.raywenderlich.com/65964/create-a-framework-for-ios
- 为所有通用 类 创建一个核心模块框架,将作为 Company1Extension、Company2Extension 为不同的应用程序共享。
- 现在通过创建各自的工作区将这个核心模块框架包含到各个项目中。
- 各个扩展项目将拥有自己的资产、应用程序图标、应用程序名称。
- 请注意,此方法的缺点之一是您不能在其中包含 pods。您必须为任何第三方库选择 Carthage 或 Git 子模块。
- 这种方法的优点之一是您可以通过指定要扩展到扩展的功能或类来维护核心模块的代码安全。
注意:在应用发布期间,请不要忘记确保 ipa 文件的有效负载结构正确。