处理iOS Framework项目的依赖关系

我已经使用这个方法创build了iOS Framework项目: https : //github.com/jverkoey/iOS-Framework

工作很整洁,但我有点困惑,如何包括我的框架工作所需的库/框架,特别是如何做到这一点,以防万一使用我的框架的第三方客户端应用程序可以包括这些库也没有冲突。

假设我的框架代码需要这两件事情:

  • FacebookSDK.framework
  • libFlurry.a

第一个是iOS框架。 当我把它添加到我的框架中的“链接二进制库”阶段,并尝试编译使用我的框架的客户端项目链接器抱怨丢失的符号 – 我需要添加FacebookSDK到客户端项目这是伟大的:如果客户端应用程序想使用Facebook冲突。

但是,当我做同样的Flurry静态库时,编译客户端项目时,我得到重复的符号错误。 这让我困惑了一下,因为不是FacebookSDK.framework只是一个打包的静态库?

ukaszs-iMac:FacebookSDK.framework lukasz$ file Versions/A/FacebookSDK Versions/A/FacebookSDK: Mach-O universal binary with 3 architectures Versions/A/FacebookSDK (for architecture i386): current ar archive random library Versions/A/FacebookSDK (for architecture armv7): current ar archive random library Versions/A/FacebookSDK (for architecture cputype (12) cpusubtype (11)): current ar archive random library 

所以我的问题是:

  1. 为什么embedded在框架(如Facebook)的图书馆没有链接到我的框架项目产品,而库包括作为.a文件是?
  2. 如何在我的框架中包含.a文件,以便在使用我的框架的客户端应用程序也需要这个特定的静态库时,它不会产生重复的符号错误?

对于您所描述的用例,您应该从应用程序链接到这些外部库,而不是您自己的框架。 它可以是一个或另一个,但它不可能是两个。

如果您决定这些依赖关系属于应用程序的责任,那么您可以将其从“与库链接二进制文件”以及任何其他显式链接configuration中移除,只需将您的框架项目与这些框架和库的path进行匹配,以便find在编译时符号(但不与它们链接)(即库的path应该包含在LIBRARY_SEARCH_PATHS中)。

  1. 使用cocoapods,这很容易( http://cocoapods.org/

  2. 您的应用程序开发人员将不得不包含pod文件并下载依赖关系。

  3. 开发您的SDK时,请使用SDK上的参考应用程序/演示应用程序来模拟此操作。

构build你的框架时你不应该链接任何东西,而只需要用你的框架对象创build一个*.a二进制文件。

另外,您不应该在框架中包含来自其他库的代码,因为客户端应用程序可能直接添加相同的库或需要不同版本的库,从而产生冲突。

当然你也可以参考你框架中其他库的*.h头文件来编译你的对象。

因此,你的框架的安装步骤应该详细介绍其他需要的框架/库,它们支持的版本,如何添加资源文件(如果有的话)等。只是为什么你可能要考虑创build一个CocoaPods ' podspec代替。

使用CocoaPods依赖pipe理器。 这是一个很好的指导,

7个迷你video教程

你应该使用CocoaPods。 您可以通过链接到CocoaPod来完成对Facebook的依赖。

如果您想在您的pod中包含该特定版本的Facebook,则可以将其放入您的repo中,并使用vendored_frameworks属性来引用它。

同样,如果你想供应libFlurry.a,你可以使用s.vendored_libraries

对于系统库,您不需要供应它们,例如libZ.a

我强烈build议使用pod lib create YourPodNamepod lib create YourPodName 。 他们最近改变了这个工作的机制,这真的很好。

您可以创build一个示例项目,显示如何在应用程序的上下文中使用您的代码。

然后,我刚刚了解到的其他一些干净的东西,有人可以做pod try YourPodName ,它会自动下载,集成和运行Xcode项目。

cocoa豆是值得的麻烦。

我使用CocoaPods构build我的框架项目。 该框架使用CocoaPods的一些第三方库。 Podfile指定安装依赖框架的目标。 当我构build框架时,它包含二进制文件中的所有库。

如果我添加use_frameworks! 在Podfile中,当构build框架时,它将不包含第三方库。

大多数情况下,如果你安装第三方框架,你可以安装cocoapods(这真的很好,我肯定会这样做),或者他们提供你下载框架,并将其包含在你的项目。 如果您决定下载该库并将其包含在内,则通常会在“入门”指南中列出您需要的框架。

手段:提供他们安装使用cocoapods并下载你的图书馆,但不包括任何其他,给他们一个清单,他们需要什么。