RestKit 和 CocoaLumberjack 在 Xcode7 中集成为框架

Posted

技术标签:

【中文标题】RestKit 和 CocoaLumberjack 在 Xcode7 中集成为框架【英文标题】:RestKit and CocoaLumberjack integrated as frameworks in Xcode7 【发布时间】:2015-08-10 15:04:31 【问题描述】:

我正在开发一个同时使用 RestKit 和 CocoaLumberjack 的项目。该项目还使用了其他一些 pod,其中一些仅存在于 swift 中。我使用 cocoapods 0.38.2 进行依赖管理,我的 podfile 看起来像这样(为了便于阅读,删除了其他 pod):

source 'https://github.com/CocoaPods/Specs.git'

platform :ios, '8.0'
use_frameworks!

pod 'RestKit'
pod 'CocoaLumberjack'

我需要使用use_frameworks!,因为其他 pod 是 swift-only。我尝试使用 Xcode7 beta 5 编译它,我收到以下错误:

“_OBJC_CLASS_$_DDLog”,引用自:

  objc-class-ref in RKLumberjackLogger.o

ld:未找到架构 x86_64 的符号

所以我查看了有问题的文件,发现了这个:

#if __has_include("DDLog.h")
#import "RKLumberjackLogger.h"
#import "DDLog.h"

如果DDLog.h 不存在,看起来整个文件解析为空,在这种情况下,我认为 RestKit 日志记录会退回到 NSLog 或其他什么。否则,使用 Lumberjack 日志记录,这正是我想要的。

经过一番调查,我怀疑 RestKit 以某种方式看到了 CocoaLumberjack 标头(DDLog.h 所在的位置),但在构建项目时没有正确链接到它。如果您有更好的想法,请随意质疑,但我可以确认转到 CocoaLumberjack 源并手动将 DDLog.m 作为成员添加到 RestKit 框架目标允许我正确编译项目。

所以,我的问题是,解决这个问题的正确方法是什么? RestKit 不直接依赖于 CocoaLumberjack,而是尝试检测它并尽可能使用它,但失败得很惨。有没有办法从我的项目级别将 RestKit 与 Lumberjack 链接起来,这样我就不必修改 pod?

示例项目可以在here找到

【问题讨论】:

【参考方案1】:

你的怀疑是正确的。

RestKit 以某种方式看到 CocoaLumberjack 标头(DDLog.h 所在的位置),但在构建项目时没有正确链接到它

这是一个带有 RestKit 的problem,您在自己的项目中所做的一切都是一种解决方法。因此可以说,在您的项目中没有一种正确的方法可以解决此问题。

我已经提交了一个拉取请求来解决这个问题。


更新:

拉取请求已合并,但在撰写此更新时,尚未发布新版本的 RestKit。

pod "RestKit", :head, :subspecs => ['Core', 'CocoaLumberjack']

RestKit 的 Lumberjack 日志记录功能已移至单独的子规范中,如果您想使用它,您必须指定该子规范。 :head 会告诉 CocoaPods 使用当前的 master 而不是发布的版本。

【讨论】:

感谢 Tim,我喜欢解决方案 2,这将使我的 CI 再次工作。你能看看similar problem I described here。也许你也可以帮我解决这个问题。

以上是关于RestKit 和 CocoaLumberjack 在 Xcode7 中集成为框架的主要内容,如果未能解决你的问题,请参考以下文章

CocoaLumberjack日志框架的简单归纳

(20160604)开源第三方学习之CocoaLumberjack

项目中包含 CocoaLumberjack 时 GCDWebServer 无法编译

使用CocoaLumberjack时,自定义的log文件名

利用 CocoaLumberjack 搭建自己的 Log 系统

运行测试用例时出现 CocoaLumberJack XCTest 链接器错误