在Swift中将外部框架嵌入自制私有框架

4

我使用Xcode 6和Swift构建了一个框架,我的框架使用SwiftyJSON作为依赖项 - 通过Carthage添加。 我归档了我的框架,并使用lipo为模拟器和iOS设备创建了一个构建版本,在尝试将我的框架用于空应用程序时,运行时出现崩溃:

dyld: Library not loaded: @rpath/SwiftyJSON.framework/SwiftyJSON
Referenced from: /Users/hd/Library/Developer/CoreSimulator/Devices/324FD1CD-4A06-459B-AE6D-318197B5697E/data/Containers/Bundle/Application/555871BB-7AA1-4AED-90CE-EE0A628A794F/CollaborativeTodo.app/Frameworks/XXXXX.framework/XXXXX
Reason: no suitable image found.  Did find:
/Users/hd/Library/Developer/CoreSimulator/Devices/324FD1CD-4A06-459B-AE6D-318197B5697E/data/Containers/Bundle/Application/555871BB-7AA1-4AED-90CE-EE0A628A794F/CollaborativeTodo.app/Frameworks/SwiftyJSON.framework/SwiftyJSON: no matching architecture in universal wrapper

下面是翻译的结果:

这是我的目录树 -- 框架名称被故意模糊处理了:

项目目录树

常规选项卡:

常规

构建阶段: 构建阶段

如果我在项目中使用Carthage包含SwiftyJSON,那么它就能够工作,但我不想强制用户包含第三方库。 如何将SwiftyJSON嵌入到我的框架中,并告诉Xcode在运行时使用嵌入的版本,而不是尝试在项目中查找该框架?

1个回答

5
你不能避免在应用程序中直接包含SwiftlyJSON。更好的说法是,你不应该避免让应用程序包含SwiftlyJSON。如果应用程序已经因为其他原因拥有SwiftlyJSON,你将会因为重复符号而给他们带来巨大的痛苦。根据他们的操作方式,他们可能不会得到错误,而只是未定义的行为,这更糟糕。自动包含功能非常好,直到它完全崩溃,没有人能弄清楚如何修复它。如果你在StackOverflow上搜索“iOS重复符号”,我估计其中约一半是由于框架尝试自动包含子框架(通常是SBJSON)。
记录你所依赖的内容,并将其作为嵌套依赖项包含在你的Cartfile中。Carthage会为他们构建它(他们仍然需要将其拖入他们的项目中)。

我已经计划使用Carthage来分发它并使SwiftyJSON成为依赖项,但我想知道是否有更聪明的解决方案。非常感谢! - sweepy_
关于此问题有任何更新吗?我的自定义动态框架依赖于外部库。使用我的框架的主机应用程序找不到这些依赖项。获取外部框架的链接器错误。 - Anil Varghese
@AnilVarghese 我不确定你在这里所说的“更新”是什么意思。需求没有改变,也没有需求的原因发生变化。消费应用程序必须将所有依赖项链接在一起。主机应用程序是否已配置为链接所有框架(包括您的依赖项)? - Rob Napier
@RobNapier 我们有一个动态框架项目,用于在多个应用程序(消费者)之间共享公共代码,称之为SDK。 SDK项目已配置为链接到多个外部框架,如Facebook、OpenTok等,并将此项目添加到共享消费者项目的工作区。 SDK成功构建。现在我想访问通过我的SDK链接的外部框架,但是消费者应用程序失败并出现链接器错误。我该如何告诉链接器,它所引用的框架在SDK中。我不想保留相同工作的两个副本。谢谢。 - Anil Varghese
@AnilVarghese 第三方框架不应该通过“我的SDK”链接。它们应该由应用程序直接链接。例如,应用程序应该在其链接步骤中明确列出Facebook。是否已按此配置? - Rob Napier
显示剩余2条评论

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