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

Embed external framework into home-made private framework in Swift

我用Xcode6和Swift搭建了一个框架,我的框架用的是SwiftyJSON as a dependency - added through 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 在运行时使用嵌入式版本,而不是试图在项目中查找框架?

您无法避免让应用程序直接包含 SwiftlyJSON。更好的说法是,您应该 而不是 避免让应用包含 SwiftlyJSON。如果该应用程序由于某些其他原因已经具有 SwiftlyJSON,那么由于重复的符号,您将给他们带来巨大的痛苦。根据他们做事的具体方式,他们可能不会出错,只会出现未定义的行为,这更糟。自动包含是一种非常好的功能,直到它完全爆炸并且没有人能弄清楚如何修复它。如果你在 Whosebug 上搜索 "ios duplicated symbols",我估计其中大约一半是由于框架试图自动包含子框架(通常是 SBJSON)。

记录您所依赖的内容并将其作为嵌套依赖项包含在您的 Cartfile 中。 Carthage 将为他们构建它(他们仍然需要将其拖到他们的项目中)。