ios 库?静态?动态?或框架?项目在另一个项目中

mbskvtky  于 2023-03-05  发布在  iOS
关注(0)|答案(3)|浏览(129)

我有一个现有的iOS应用程序,我想添加一大块代码,我一直在开发另一个项目,只是为了方便测试。新的代码块基本上是处理保存图像到各种共享服务等。因为共享代码需要大量的测试和未来的更新,我想知道什么是最好的方式将代码块纳入我现有的应用程序。
我不知道它应该是一个静态库、动态库还是一个框架,老实说,我真的不知道有什么区别,或者我应该如何着手并在Xcode中设置它。
我所知道的是,我需要/想要为共享代码保留一个单独的测试和更新应用程序,并让主应用程序使用它。

hc2pp10m

hc2pp10m1#

首先是一些通用定义(特定于iOS):

    • 静态库**,正式名称为 * 静态共享库 *-编译时链接的代码单元,不会更改。

然而,iOS静态库允许包含图像/资产(仅代码)。不过,您可以通过使用媒体包来绕过这个挑战。
一个更好、更正式的定义可以在Wikipedia here上找到。

    • 动态库**,正式名称为 * 动态共享库 *-在运行时绑定符号。解析符号时,将链接包含该符号的相应模块。

建议使用动态共享库,因为它有很多优点。但是,早期版本的Mach-O启动应用的速度比使用静态库的应用稍慢。最新版本的Mach-O启动应用的速度比使用静态库的应用快得多。
Apple不建议使用Standalone动态共享库-这种动态共享库仅适用于macOS平台(库存储在/use/lib,只有Apple可以正式这样做),但非独立动态共享库是当今任何框架的一部分(. framework bundle)。

    • Framework**(又名. framework文件)-只是一个捆绑包(与应用捆绑包相同,但略有不同)。它是一个包含一组资源的文件夹:
  • 动态/静态共享库
  • 笔尖锉;
  • 局部化字符串;
  • 头文件
  • 文件;
  • 资产文件等。

因此,实际上可以有一个静态框架或一个动态框架,它们只是带有静态共享库或动态共享库的容器。
更多详情请参见Wiki on Software Framework
因此,在iOS上,您唯一的选择基本上是使用静态共享库(.a文件)或框架(内部包含静态或动态共享库)。

    • 编辑**

关于项目中的 * subproject *,据我所知,要使其正确工作/编译,您必须建立一个编译链,首先编译子项目,这将创建一个静态框架.a文件,该文件被项目用作依赖项。
这里有另一个有用的教程,其中谈到这一点:
http://www.cocoanetics.com/2011/12/sub-projects-in-xcode/

jum4pzuy

jum4pzuy2#

    • Mach-O文件格式(马赫对象-.o)**

在iOS世界中,每个源文件都转换为目标文件-ABI About(https://stackoverflow.com/a/59271017/4770877) Mach-O文件About(https://stackoverflow.com/a/59214522/4770877),将打包为最终可执行文件(应用程序、框架)、文件(库),其行为由Mach-O typeAbout(https://stackoverflow.com/a/61035316/4770877)确定
Package是一个目录,其行为类似于文件-opaque file。创建该目录的目的是用户体验,以使对内部结构进行某些更改变得复杂,从而导致不可预测的程序行为。Package用于Document PackageBundle。您可以在Finder中使用Show Package Contents
Bundle是一个具有特定结构的目录,用于组织二进制文件(可执行代码)和该代码的资源(例如图像、nibs ... www.example.com文件About(https://stackoverflow.com/a/61040332/4770877))。包包含Info.plistAbout(https://stackoverflow.com/a/61118898/4770877)文件。包是为开发人员体验创建的。它也可以打包。包有几种类型:Assets.car file About(https://stackoverflow.com/a/61040332/4770877) ). Bundle contains Info.plistAbout(https://stackoverflow.com/a/61118898/4770877) file. Bundle was created fordeveloper experience. Also it can be packaged. There are several types of bundle:

  • x1米9英寸1x-Application target
  • 作为子类型的framework bundleversioned bundle-Framework Target
  • loadable bundle(又名plug-in bundle)-"...捆绑包"(UI测试捆绑包、单元测试捆绑包)-可在运行时加载。适用于Mac OS的.bundle扩展
  • [Mac OS] XPC Service-跨进程通信是一种进程间通信(IPC)。它可用作不同进程(由launchd根进程管理)About(https://stackoverflow.com/a/66371178/4770877)上的模块
  • 其他(dSYMAbout(https://stackoverflow.com/a/62219237/4770877)捆绑包)

Application-.ipa.appAbout(https://stackoverflow.com/a/61027062/4770877)-packagedapplication bundle-可启动的程序。
Application extensionAbout(https://stackoverflow.com/a/66520509/4770877)-来自iOS v8-扩展了用户与其他应用程序交互时可用的应用程序功能。App extension作为捆绑包是Containing app的一部分,但它在自己的沙箱(处理器、内存...)上运行,尝试使用app extension的应用程序称为Host App。扩展应用程序的类型:

  • 行动
  • 份额
  • 照片编辑
  • 今日又称小工具
  • ...

共享公共代码和资源。当部署目标为iOS 8+时可用。
Tests-packagedloadable bundle,用于测试二进制文件。插件架构允许我们将新功能(测试用例)作为单独模块添加到现有二进制文件中

    • 库和框架**

Library vs Framework(https://stackoverflow.com/a/66808163/4770877)
Martin Fowler on InversionOfControl
库本质上是一组你可以调用的函数,现在通常被组织成类。每个调用做一些工作并将控制权返回给客户端。
一个框架包含了一些抽象的设计,内置了更多的行为。为了使用它,你需要通过子类化或者插入你自己的类来将你的行为插入到框架的不同地方。然后框架的代码在这些地方调用你的代码。程序的主控制被反转,从你身上转移到框架上。这种现象就是控制反转(也称为好莱坞原则-"不要打电话给我们,我们会打电话给你")

    • iOS上的库和框架**

他们可以帮助您解决:模块化、重用、封装、缩短构建时间
Library是为一个或多个体系结构编译的Mach-O对象文件check static or dynamic(https://stackoverflow.com/a/61027434/4770877)的集合。
Static library-.a(aka static archive library,static linked shared library [doc])--当您将其添加到应用程序中时,static linker编译时将合并库中的目标文件,并将它们与应用程序目标文件打包成一个可执行文件。缺点是输出文件较大
从Xcode 9.0开始,支持Swift静态库。
x1米36英寸1x-x1米37英寸1x(又称动态共享库、共享对象、动态链接库[doc])在加载或运行时与应用的可执行文件动态链接,但不会复制到其中。在练习中,应用程序的软件包将包含带有.dylib文件的Frameworks文件夹。所有iOS和macOSsystem库都是dynamic。缺点是启动时间很慢,因为所有动态库都需要复制和链接。
iOS static vs dynamic library(https://stackoverflow.com/a/73857639/4770877)
Static vs dynamic linking(https://stackoverflow.com/a/61140381/4770877)
Text-based stub library-.tbdAbout(https://stackoverflow.com/a/55560213/4770877),它是dynamic library的文本存根,位于目标设备上。因此,您不应将动态库打包到您的捆绑包中。它具有大小效应。
Framework又名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
Static vs dynamic framework(https://stackoverflow.com/a/57741985/4770877)

Umbrella frameworkAggregate target(https://stackoverflow.com/a/59215042/4770877)是一个包含其他框架的框架。它在iOS上不受官方支持,这就是为什么不建议开发者创建它们[官方文档]。实际上它是一组子框架(或嵌套框架)。当您创建具有依赖项的框架时,消费者(例如应用程序)负责将此依赖项与您的框架一起添加到项目中。作为开发人员,很自然地,我们会设法把这种责任从消费者身上转移到你身上。因此,您认为Umbrella framework是救星,但通常它会导致管理版本以及创建和支持它的复杂性方面的严重问题。
Fake Framework-是static library下的特定操作的结果,用于创建一个带有.framework扩展的捆绑包,该捆绑包将表现为dynamic framework。当Xcode没有框架模板而不支持创建框架时使用了此技术。fake framework的实现之一。随着Xcode 6,苹果增加了iOS框架支持。
Modular FrameworkAbout(https://stackoverflow.com/a/59213694/4770877)-@import它是一个包含.modulemap文件的框架。模块可以包含子模块。主要优点是使用Modular Framework可以节省构建时间。
Universal Library or Framework(aka Fat)lipo(https://stackoverflow.com/a/59215277/4770877) Aggregate target(https://stackoverflow.com/a/59215042/4770877)包含多个架构。例如,您的发布版本应该支持一些拱,您可以通过Build Active Architecture OnlyONLY_ACTIVE_ARCH(https://stackoverflow.com/a/59215429/4770877)进行调整
XCFrameworkAbout(https://stackoverflow.com/a/67181295/4770877)由Xcode 11引入,它是一个包含多种架构(arm、x86_64 ...)和平台(iOS、MacOS ...)的bundle,应该取代Universal Framework
DependencyAbout(https://stackoverflow.com/a/59215808/4770877)您可以使用第三方代码作为目标的一部分,它允许您重用来自许多源的代码,如另一个项目、同一工作区中的项目、另一个目标、库、框架等。

Xcode Build System(https://stackoverflow.com/a/59216120/4770877)
Xcode components(https://stackoverflow.com/a/59215808/4770877)
Dynamic linker(https://stackoverflow.com/a/59216681/4770877)

qvk1mo1f

qvk1mo1f3#

您还可以为CocoaPods(www.example.com)创建.podspec文件http://guides.cocoapods.org/making/private-cocoapods.html#1.-create-a-private-spec-repo,并像使用任何其他pod一样使用它,唯一的区别是它是您的私有pod,对外部世界不可见(我不确定如果您的pod创建CoreData模型会发生什么,但据我所知,情况并非如此)。

相关问题