如何在没有嵌入式二进制文件的情况下构建iOS动态框架?

3
我尝试为iOS生成名为AfTestFramework的框架。我通过Xcode创建了Cocoa Touch Framework,并编写了一些基本代码,然后运行它,得到了以下结果:

enter image description here

到目前为止一切都很顺利。
我创建了一个新的测试应用程序,并将 AfTestFramework.framework 拖放到项目中,就像 crashlytics 一样(如下所示)。
构建项目并运行后,我遇到了 Library not loaded ... Reason: image not found 的问题:

dyld: Library not loaded: @rpath/AfTestFramework.framework/AfTestFramework Referenced from: /var/containers/Bundle/Application/9B12D0AD-94AA-4119-A5DE-6BCAA806FA9F/TestAvoidEmbedded1.app/TestAvoidEmbedded1 Reason: image not found

我知道解决方法是将此框架附加到 Embedded Binaries,但我正在寻找避免这种方法的方式。
此外,它要求创建两个框架:模拟器和发布版本,否则我无法使用我的框架发布应用程序,这看起来有点混乱和奇怪。
我发现以下框架可以在不使用 Embedded Binaries 的情况下工作:

等等。

到目前为止,我还没有找到任何说明,我也知道这是一些新东西。

我开始尝试使用xcodebuild,例如:

 xcodebuild -sdk "iphoneos10.1" "ARCHS=arm64 armv7 armv7s" "VALID_ARCHS=arm64 armv7 armv7s" "ONLY_ACTIVE_ARCH=NO" -target AfTestFramework  -configuration "Release"  clean build

但是没有成功。

有人能为这个问题提供一些解决方案吗?

3个回答

3
如果您在iOS项目中添加一个动态框架,您必须将其添加到Embedded Binaries中。与静态库相反,动态库是在运行时加载的。因此,动态链接器必须在设备上访问它们。
如果不将框架嵌入到应用程序中,唯一可能的方式是将其静态绑定到应用程序中。为此,您应该从框架创建一个静态库。(可能可以使用libtool(1)来辅助完成这项工作。)但无论如何,如果框架需要其包结构来加载资源等,您可能会遇到其他问题。

是的,我同意,我发现Crashlytics是静态框架:https://dev59.com/91wY5IYBdhLWcg3weXkb - Maxim Shoustin

0

这可能有点老,但如果将来需要参考的话: 你可以这样做

$lipo -create <path to simulator framework> <path to device framework> -output <path to the output framework>

0

我不太确定你想要实现什么,但听起来你想创建一个依赖于另一个框架的框架。

因此,在使用时,它将是这样的: app -> your-framework -> some-other-framework

我强烈建议您考虑 carthage 作为解决方案。Carthage 是一种 OS X 原生依赖管理器,旨在为您管理依赖项。

首先,您需要检查您的框架所使用的框架是否适用于 Carthage。暂时假设是这样。

在您的框架项目中,您将添加一个 Cartfile,在其中声明您对其他框架的依赖关系,然后使用 Carthage 下载和构建其他框架。然后,您将像使用任何 Apple 提供的框架一样将构建的框架添加到您的项目中。您不需要嵌入框架,一般情况下也不建议这样做。Carthage 将处理此问题。

在应用程序项目中,您需要添加一个 Cartfile,但是您只需要在其中指定您的项目。当 Carthage 构建框架时,它将自动定位其他框架,并将其下载和构建。然后在应用程序的构建阶段,您只需指定链接到这两个框架,并添加一个 carthage-copy 脚本阶段以将它们包含在完成应用程序的 Frameworks 目录中。
关于为模拟器和发布构建。您不需要构建多个目标。首先,使用 Carthage 意味着仅在需要时才会构建框架,因此这消除了您提供二进制文件的任何要求。
在告诉 Carthage 构建依赖项时,默认情况下会构建 Release 二进制文件。要构建 Debug 框架进行测试,只需将 --configuration Debug 添加到 Carthage 的命令行参数中即可。
最后,公平地说,还有另外两个软件包管理器:基于Ruby的CocoaPods是一个较旧的管理器,而对于Swift,则有Swift Package Manager。就个人而言,我更喜欢Carthage,原因在我在博客文章这里中解释了。

谢谢您的回复,我没有构建应用程序,而是框架。我的框架不使用其他框架,它是纯Obj-C代码。我只是想知道Chartboost、crashlytics和其他我不需要添加到“嵌入式二进制文件”中的框架是如何工作的。 - Maxim Shoustin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接