图书馆?静态的?动态?还是框架?项目在另一个项目内

piz*_*lms 132 xcode frameworks static-libraries ios

我有一个现有的iOS应用程序,并希望添加一大块代码,我一直在开发另一个项目,以方便测试.新的块基本上处理将图像保存到各种共享服务等.因为共享代码需要大量的测试和未来的更新,我想知道将代码块合并到我现有的应用程序中的最佳方法是什么.

我不知道它应该是静态库,动态库还是框架,老实说,我不确定区别是什么,或者我应该如何去做它并在Xcode中设置它.

我所知道的是,我需要/想要为共享代码保留单独的测试和更新应用程序,并让主应用程序使用它.

如果你还不能说,我不是一个git wiz.我只是一个简单的单人开发人员.

任何帮助或方向将不胜感激.谢谢!

JRG*_*per 184

首先,一些一般定义(特定于iOS):

静态库 - 在编译时链接的代码单元,不会更改.

然而,iOS的静态库没有允许包含图像/资产(唯一的代码).您可以通过使用媒体包来解决这一挑战.

一个更好的,更正式的定义可以在维基百科上找到这里.

动态库 - 在运行时链接的代码和/或资产的一个单元,可能会发生变化.

但是,只允许Apple为iOS创建动态库.您不能创建这些,因为这会让您的应用被拒绝.(请参阅其他SO帖子以获得确认和推理).

软件框架 - 完成任务的一组编译代码......因此,您实际上可以拥有静态框架动态框架,这些框架通常只是上述的编译版本.

有关更多详细信息,请参阅Wiki on Software Framework.

因此,在iOS上,您唯一的选择基本上是使用静态库或静态框架(主要区别在于静态框架.a最常作为编译文件分发,而静态库可能只是作为子项目包含 - 您可以看到所有代码 - 首先编译并将其生成的.a文件用作项目的依赖项.

既然我们对这些术语很清楚,那么为iOS设置静态库和支持媒体包并不困难,并且有许多关于如何做到这一点的教程.我个人会推荐这个:

https://github.com/jverkoey/iOS-Framework

这是一个非常简单的指南,并没有处理"假静态库"的缺点...查看更多信息...

一旦你创建了静态库,它就像在Git中包含它作为子模块一样简单,以便在不同的项目中使用.

祝好运.

编辑

关于项目中的子项目,据我所知,为了使其正常工作/编译,您基本上必须建立一个编译链,其中首先编译子项目,这将创建一个.a用作依赖项的静态框架文件通过该项目.

这是另一个有用的教程,讨论这个:

http://www.cocoanetics.com/2011/12/sub-projects-in-xcode/

编辑2

从iOS 8开始,Apple现在允许开发人员创建动态框架!(注意:您的应用必须具有iOS 8的最低目标才能包含动态框架...不允许后端移植.)

这已添加为新项目模板.在Xcode 6.1中,可以在以下位置找到:

New Project -> iOS -> Framework & Library -> Cocoa Touch Framework
Run Code Online (Sandbox Code Playgroud)


yoA*_*ex5 61

Mach-O 文件格式(Mach Object - .o)

在 iOS 世界中,每个源文件都被转换为目标文件 - ABI [About] Mach-O 文件[About]将被打包成最终的可执行(应用程序、框架)、文件(库),其行为由[About]决定Mach-O type]

Package是一个目录,它本身作为一个文件 - opaque file. 它是为用户体验而创建的,使对内部结构进行一些更改变得复杂,这些更改可能导致不可预测的程序行为。包用于Document Package或与Bundle. 您可以Show Package Contents在 Finder 中使用

Bundle是一个具有特定结构的目录,用于组织二进制(可执行代码)和该代码的资源(例如图像、笔尖...)。捆绑包包含Info.plist[关于]文件。Bundle 是为开发人员体验而创建的。也可以打包。有几种类型的捆绑包:

  • application bundle —— Application target
  • framework bundleversioned bundle作为一个子类型 -Framework Target
  • loadable bundle(又名plug-in bundle) - '... Bundle'(UI 测试包,单元测试包) - 可以在运行时加载。.bundleMac OS 扩展
  • [Mac OS] XPC Service- 跨进程通信是一种进程间通信 (IPC)。它可以用作不同进程上的模块(由launchd根进程管理)[关于]
  • 其他(dSYM[关于]捆绑)

Application- .ipa, .app[关于] - packaged application bundle- 可启动的程序。

Application extension[关于] - 来自 iOS v8 - 扩展了当用户与其他应用程序交互时可用的应用程序功能。App extension作为捆绑包的一部分,Containing app但它在自己的沙箱(处理器、内存...)上运行,因此尝试使用的应用程序app extension被称为Host App。扩展应用程序的类型:

  • 行动
  • 分享
  • 照片编辑
  • 今天又名小部件
  • ...

共享公共代码和资源。当部署目标为 iOS 8+ 时可用。

Tests-packaged loadable bundle用于测试二进制文件。插件架构允许我们将新功能(测试用例)作为单独的模块添加到现有二进制文件中

库和框架

[库与框架]

Martin Fowler 谈 InversionOfControl

库本质上是一组您可以调用的函数,现在通常组织成类。每个调用都会做一些工作并将控制权返回给客户端。

框架体现了一些抽象的设计,内置了更多的行为。为了使用它,你需要通过子类化或插入你自己的类,将你的行为插入到框架中的不同位置。然后框架的代码会在这些点调用您的代码。程序的主要控制被倒置,从你转移到框架。这种现象就是控制反转(也称为好莱坞原则——“不要打电话给我们,我们会打电话给你”)

iOS 上的库和框架

他们可以帮助您解决:模块化、重用、封装、缩短构建时间

Library是为一个或多个体系结构编译的 Mach-O 目标文件[检查静态或动态]的集合。

Static library- .a(又名静态存档库,静态链接共享库[doc]) - 当您将其添加到应用程序中时,编译期间的静态链接器将合并库中的目标文件并将它们与应用程序目标文件一起打包成一个可执行文件文件。缺点是输出文件大

从 Xcode 9.0 开始,支持 Swift 静态库。

Dynamic library- .dylib(又名动态共享库、共享对象、动态链接库[doc])在加载或运行时与应用程序的可执行文件动态链接,但不会复制到其中。在练习应用程序的包中将包含带有文件的Frameworks 文件夹。所有 iOS 和 macOS系统库都是. 缺点是启动时间很慢,因为所有动态库都应该被复制和链接。.dylibdynamic

[静态与动态链接]

Text-based stub library- .tbd[关于],它dynamic library是位于目标设备上的文本存根。因此,您不应将动态库打包到您的包中。它具有尺寸效应。

Frameworkaka binary framework-.framework是一个not packaged framework bundle(允许开发人员轻松查看头文件和资源),它包含一个编译的static or dynamic库、头文件和资源。

Static framework包含一个static library与其资源打包在一起的文件。

Dynamic framework又名Embedded framework- 来自 iOS v8 - 包含dynamic library和 资源。除此之外,动态框架可以在单个包 ( versioned bundle) 中包含同一动态库的不同版本。也Embedded framework用于App Extension

【静态vs动态框架】

Umbrella framework [聚合目标]是一个包含其他框架的框架。它在 iOS 上不受官方支持,这就是为什么不建议开发人员创建它们[Official doc]。实际上它是一组子框架(或嵌套框架)。当您创建具有依赖项的框架时,使用者(例如应用程序)负责将此依赖项与您的框架一起添加到项目中。作为开发人员,很自然地尝试找到一种方法将这种责任从消费者转移到您的。因此,您认为这Umbrella framework是一种拯救,但通常它会导致管理版本以及创建和支持它的复杂性方面出现严重问题。

Fake Framework- 是在 astatic library下创建具有.framework扩展名的包的特定操作的结果,该包将表现为dynamic framework. 当 Xcode 不支持创建框架时使用此技术,因为它没有框架模板。假框架的实现之一。在 Xcode 6 中,Apple 添加了 iOS 框架支持。

Modular Framework[关于] -@import它是一个框架,里面包含一个.modulemap文件。模块可以包含子模块。主要优点是您可以使用Modular Framework.

Universal Library or Framework(aka Fat) [lipo] [Aggregate target]包含多个架构。例如,您的发布版本应该支持一些架构,您可以通过[ONLY_ACTIVE_ARCH] 对其进行调节Build Active Architecture Only

XCFramework[About]是由 Xcode 11 引入的,它是一个bundle包含多种架构(arm、x86_64...)和平台(iOS、MacOS...)的。它应该取代一个Universal Framework

Dependency[关于]您可以使用第三方代码作为目标的一部分。它允许您重用来自许多来源的代码,例如 - 另一个项目、同一工作区中的项目、另一个目标、库、框架等。

如何构建和使用静态库:

如何构建和使用动态框架[更改为静态]

[Xcode Build System]
[Xcode 组件]
[动态链接器]


归档时间:

查看次数:

46445 次

最近记录:

5 年,9 月 前