【问题标题】:Making an iOS framework: including 3rd party libraries and code制作 iOS 框架:包括 3rd 方库和代码
【发布时间】:2013-02-13 13:27:42
【问题描述】:

我正在制作一个静态 iOS 框架。我想使用第 3 方代码,让我们在我的框架中使用 AFNetworking 作为示例。 AFNetworking 很受欢迎。我现在可以感觉到命名空间冲突。这里的最佳做法是什么?据我了解,我有 3 个选项:

1) 将AFNetworking 构建到我的框架中,导出标题。这让客户可以在我的库中使用AFNetworking 的版本,但他们不能使用也链接AFNetworking 的其他框架。如果他们建立在 AFNetworking 的基础上,他们会依靠我来更新它。

2) 针对AFNetworking 标头的代码,但让第三方在他们的项目中包含AFNetworking。这为框架消费者增加了一个额外的步骤,他们必须添加AFNetworking 源。将来可能会出现版本不兼容,但至少如果另一个框架使用AFNetworking,他们可以同时使用它。

3) 重新命名空间 AFNetworking 并保持标题私有。通过这种方式,我以任何方式避免了命名空间冲突,但更新我的AFNetworking 副本变得非常困难。最终的二进制文件变得有点大,但所有的互操作性问题都得到了解决。这对我来说还有很多工作。

我还有其他选择吗?最佳实践是什么?

【问题讨论】:

  • 我不明白为什么会有命名空间冲突(除非你在你的类前面加上AF)。使用 AFNetworking 的最新稳定版本,但让用户包含它。如果您使用的 API 是公开的,则不太可能更改。
  • 你检查过cocoapods吗?您可以将依赖项添加到其他 pod。
  • @H2CO3 如果编译的 AFNetworking 对象包含在我的库二进制文件中,并且用户自己添加代码或使用包含它的其他框架,则当链接器尝试时,objective-c 中将发生命名空间冲突制作最终的应用程序二进制文件。
  • @jackslash 但这就是我要说的 - 你确实包含库的二进制文件。也不是标题。您要求用户这样做。
  • 我会选择选项 2)。就个人而言,如果我下载一个依赖于另一个库的库,这没什么大不了的,实际上只需单击几下即可包含它。但是,请确保您的框架的描述文件以粗体显示警告,告诉我我将 nedd AFNetworking。还要确保如果我尝试在没有 AFNetworking 的情况下使用您的库,则会出现 真的 明确错误,告诉我我没有包含此库。我真的认为,只要您图书馆的用户消息灵通,就可以了。老实说,它会为你节省很多时间来改进你自己的库;)

标签: ios objective-c frameworks linker


【解决方案1】:

更好的选择是使用http://cocoapods.org。这样,就可以声明库的依赖关系并获得整个项目的单个下载。

不要重命名标题。既费时又难。

P.D:一个例子:

http://chariotsolutions.com/blog/post/using-cocoapods-to-manage-private-libraries/

【讨论】:

  • 这确实有要求宿主应用程序使用 Cocoapods 的缺点。
【解决方案2】:

就数字 3 而言,它不是完整的“重新命名空间”,但类似于:

http://atastypixel.com/blog/avoiding-duplicate-symbol-issues-when-using-common-utilities-within-a-static-library/

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
相关资源
最近更新 更多