我有一个现有的iOS应用,并希望添加的代码一大块,我一直在开发另一个项目只是为了便于测试。 新块与节约各种共享服务等的图像基本交易。由于是共享的代码需要大量的试验和未来更新的,我想知道什么是最好的方法,将这些代码块到我现有的应用程序。
我不知道这是否应该是一个静态库,动态库或框架,说实话,我真的不知道有什么区别,或者我应该如何去了解它,并把它在Xcode成立。
我所知道的是,我需要/想保留的共享代码独立的测试和更新应用程序,并有主要的应用程序使用它。
如果您已经不能说,我不是一个git奇才。 我只是一个简单的人开发。
任何帮助或方向将不胜感激。 谢谢!
首先,一些一般定义(具体到iOS):
静态库 -在编译时链接的代码单元,不会改变。
然而,iOS的静态库不允许包含图像/资产(唯一的代码)。 您可以通过使用一个媒体包 ,虽然解决这个难题。
一个更好的,更正式的定义可以在维基百科上找到这里 。
动态库 -在运行时可改变链接的代码和/或资产的单元。
但是,只有苹果允许为iOS创建动态库。 你不允许创建这些,因为这将让你的应用程序被拒绝。 (见本其他SO后进行确认和推理这样)。
软件框架 -编译组代码完成某项任务......因此,你其实可以有一个静态的框架或动态框架 ,这是典型的只以上的编译版本。
请参阅上的软件框架维基的更多细节。
因此在iOS上,你唯一的选择基本上是使用静态库或静态框架(主要区别在于静态框架分布编译.a
最常见的文件,而静态库可以简单地被包括作为子项目-你可以看到所有的代码-这是第一,其导致编译.a
作为该项目的依赖文件)。
现在,我们清楚(ER)在这些条款,建立一个静态库和支持媒体捆绑为iOS是不是太困难,也有关于如何做到这么多的教程。 我个人会推荐这一个:
https://github.com/jverkoey/iOS-Framework
这是一个非常直接的指导,没有涉及“假静态库”的缺点...检查它的详细信息...
一旦你创建你的静态库,它为包括其作为在不同的项目中使用Git的子模块一样简单。
祝好运。
编辑
对于项目中的一个子项目 ,因为据我所知,要得到这个工作/编译正确,实际上需要建立在子项目首先编译编译链,它创建了一个静态的框架.a
文件,该文件被用作通过该项目的依赖。
下面是其中谈到这另一个有用的教程:
http://www.cocoanetics.com/2011/12/sub-projects-in-xcode/
编辑2
由于iOS 8的,苹果现在允许开发人员创建动态的框架! (注:您的应用程序必须具备的iOS 8的最低目标,包括一个动态的框架......回移植是不允许的。)
这已被添加为新的项目模板。 在Xcode 6.1,这可以在这里找到:
New Project -> iOS -> Framework & Library -> Cocoa Touch Framework
库和框架
马丁·福勒控制反转
一个library
实际上是一组的,你可以调用的函数,这些天通常分为类。 每次调用做了一些工作,并把控制返回到客户端。
一个framework
体现了一些抽象的设计,内置了更多的功能,而且为了使用它,你需要插入您的行为变成可以通过继承或者在您自己的类插入框架中的各个地方。 然后,框架的代码调用您在这些点的代码。
库和框架在iOS
一个library
是资源的集合,代码本身,编为一个或多个架构。 它由*.o
文件(Mach-O的目标文件)。
在的情况下, static libraries (*.a)
,该应用程序使用的代码是由复制到生成的可执行文件static linker
期间compilation time
。
由于的Xcode 9.0,静态斯威夫特库现在支持
✓优点:
- 静态库保证是存在于应用程序,并拥有正确的版本。
- 没有必要保持一个应用程序了解最新的库的更新。
- 库调用的更好的性能。
✕缺点:
- 充气应用程序的大小。
- 推出时间会降低,因为臃肿的应用程序的可执行文件。
- 即使使用单一功能必须复制整个图书馆。
Dynamic libraries (*.dylib)
来自不同的static libraries
在这个意义上,它们与应用程序的可执行文件的动态链接load
或runtime
,但不能复制到其中。 其结果是,可执行更小,并且由于代码被加载仅在需要时它,启动时间典型地更快。
所有iOS和MacOS系统库是动态的。 因此,我们的应用程序将受益于未来的改进,Apple的标准库的框架,而无需创建和运输的新版本。
✓优点:
- 可以从图书馆改进中获益,而不应用程式重新编译。 特别是随着系统库有用。
- 占用较少的磁盘空间,因为它是应用程序之间共享。
- 更快的启动时间,因为它是装在按需运行时。
- 通过加载件:如果使用单一功能无需加载整个图书馆。
✕缺点:
- 可能会破坏程序如果有什么库中的改变。
- 较慢的调用库函数,因为它位于外应用程序可执行文件。
一bundle
是里面的子目录的文件目录。 在iOS上, bundles
服务方便船舶的相关文件一起在一个包中-例如,图像,笔尖,或编译的代码。 该系统将其视为一个文件,你可以不知道它的内部结构访问捆绑资源。
该library
还可以有额外的资源:头,本地化文件,图像,文档和使用的例子。 我们可以捆绑所有这一切都集中在一bundle
-和这个名称是framework
。
一个framework (*.framework)
是一种特定的一个的bundle
。 有了小的改变它的结构,它甚至可以包含其他框架。 这样的聚集被称为umbrella framework
。
Static frameworks
包含static library
与它的资源打包。
Dynamic frameworks
包含dynamic library
及其资源。 除此之外, dynamic frameworks
可以方便地包括不同版本的相同的dynamic library
在同一个框架!
如果您的部署目标是iOS8上+还您可以创建embedded framework
。
Embedded framework
是一个Dynamic framework
,并放置一个应用程序的沙箱中,并且只适用于该应用程序。 这种类型的创建首先用于扩展共享公共代码和资源。
源和多一个 。 还阅读更多在这里 , 这里 , 这里 , 这里 , 这里
您还可以创建的CocoaPods .podspec文件( http://guides.cocoapods.org/making/private-cocoapods.html#1.-create-a-private-spec-repo ),并使用它像任何其他吊舱与只知道它是你的私人舱,是不是外面的世界明显的区别(我不知道会发生什么,如果你荚应该创建CoreData模型,但事实并非如此,因为我明白)。