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

时间:2016-11-23 17:22:35

标签: ios xcode

我尝试为ios生成名为AfTestFramework的框架。我通过Xcode Cocoa Touch Framework创建了一些基本代码,运行并获得:

enter image description here

到目前为止一切顺利。

我创建了新的测试应用程序并将@drop AfTestFramework.framework拖到项目中,就像crashlytics一样(见下文)

在构建项目并运行后,我得到Library not loaded ... Reason: image not found

  

dyld:未加载库:   @ rpath / AfTestFramework.framework / AfTestFramework参考自:   /var/containers/Bundle/Application/9B12D0AD-94AA-4119-A5DE-6BCAA806FA9F/TestAvoidEmbedded1.app/TestAvoidEmbedded1原因:找不到图像

我知道解决方案是将此框架附加到Embedded Binaries,但我寻找避免这种方法的方法。

此外,它需要创建2个框架:对于模拟器和发布,否则我无法使用我的框架发布应用程序,这看起来有点混乱和奇怪。

我发现以下框架在没有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 个答案:

答案 0 :(得分:3)

如果您向iOS项目添加动态框架,则必须将其添加到嵌入式二进制文件。与静态库相反的是在运行时加载的动态库。因此,动态链接器必须在设备上访问它们。

在不嵌入框架的情况下在框架内添加代码的唯一可能方法是将其静态绑定到您的应用程序。为此,您应该从框架创建一个静态库。 (也许, libtool (1)可以帮助你。)但是,如果框架需要其捆绑结构来加载资源等,你可能会遇到其他问题。

答案 1 :(得分:0)

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

因此,在使用时,它会像 app - > your-framework - > 一些-其他的框架

我强烈建议将carthage作为我们问题的解决方案。 Carthage是一个OS X本机依赖项管理器,旨在为您管理依赖项。

首先,您需要检查您的框架使用的框架是否对Carthage友好。现在我会假设。

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

在app项目中,您还可以添加 Cartfile ,但您只需要在其中指定项目。当Carthage构建框架时,它将自动定位其他框架,下载并构建它。然后在应用程序构建阶段,您可以简单地指定再次链接两个框架并添加 carthage-copy 脚本阶段,以将它们包含在已完成应用程序的 Frameworks 目录中。

关于构建模拟器和发布。您不需要构建多个目标。首先,使用Carthage意味着框架仅在您需要时构建,因此这消除了您提供二进制文件的任何要求。

当告诉Carthage构建依赖项时,默认情况下它会构建 Release 二进制文件。构建用于测试的 Debug 框架只需将 - configuration Debug 添加到Carthage的命令行参数中。

最后 - 公平地说,还有另外两个包管理器:基于Ruby的CocoaPods,它是一个较旧的经理,而Swift是Swift包管理器。我个人更喜欢迦太基,原因是我在博客here中解释的原因。

答案 2 :(得分:0)

这是旧的,但如果对将来参考有用: 你可以做

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