【问题标题】:Duplicate interface definition for class 'GTMHTTPUploadFetcher'类“GTMHTTPUploadFetcher”的重复接口定义
【发布时间】:2015-11-07 10:47:26
【问题描述】:

我计划在我的 Swift 项目中使用 Google Drive API。我正在尝试通过 CocoaPods (v0.39.0) 添加 Drive SDK。下面是我的 Podfile。

platform :ios, '8.0'
use_frameworks!

pod 'Google-API-Client/Drive'

我添加了 use_frameworks! 标志,以便 CocoaPods 可以将 Objective-C pod 转换为 Swift 框架而不是静态库。

Pod 安装成功。但是,当我构建项目时,出现以下错误。

类“GTMHTTPUploadFetcher”的重复接口定义

删除 DerivedData 文件夹并清理项目无效。

我也尝试不添加use_frameworks!,然后通过桥接头方式添加库。这没有问题。问题是我所有其他依赖项都在它打开的情况下工作。不幸的是 CocoaPods doesn't support 只为某些 pod 转这个标志。

是否有解决此问题的解决方法?


正如 Google 的 docs 中所述,Google 工程师应该监控带有 google-drive-sdk 标记的问题,所以我希望至少他们会看到并尽快修复它。

【问题讨论】:

    标签: ios swift google-drive-api cocoapods


    【解决方案1】:

    根据谷歌的说法,这个错误是由第三方使用 cocoapod 引起的,但他们现在在项目中有一个官方 pod (https://github.com/google/google-api-objectivec-client/blob/master/GoogleAPIClient.podspec),问题应该得到解决。

    见:https://github.com/google/google-api-objectivec-client/issues/103

    用途:

    pod 'GoogleAPIClient/Drive', '~> 1.0'

    也许还有:

    pod 'GTMOAuth2'pod 'Google/SignIn'

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题。我的解决方案是不安装使用 CocoaPods 的适用于 iOS 的 Google API 客户端,因为我使用的是基于 Swift 的 pod,因此我无法删除 use_frameworks! 以试图解决重复的标头问题。

      我改为按照https://developers.google.com/drive/ios/quickstart?ver=swift 中有关步骤 2、3 和 4 的详细说明手动安装了该库。我按照说明进行操作,但将它们应用到 我现有的工作区,而不是创建一个新的工作区。

      请务必注意,我必须调整 User Header Search Paths 中的路径以匹配我实际从 Google 复制源代码的位置。

      我在此处复制说明以供参考。

      第 2 步:下载 Google 客户端库

      运行以下命令使用 git 下载库:

      • git clone https://github.com/google/google-api-objectivec-client.git
      • git clone https://github.com/google/gtm-oauth2.git
      • git clone https://github.com/google/gtm-session-fetcher.git
      • git clone https://github.com/stig/json-framework.git -b v2.3
      • cp -R gtm-oauth2/Source google-api-objectivec-client/Source/OAuth2
      • cp -R json-framework/Classes google-api-objectivec-client/Source/JSON

      第 3 步:准备工作区

      打开 Xcode 并创建一个名为“Quickstart”的新工作区。 使用 File > Add Files to "Quickstart"...,从您在上一步克隆的库中将以下项目添加到工作区:

      • google-api-objectivec-client/Source/GTL.xcodeproj
      • gtm-session-fetcher/Source/GTMSessionFetcher.xcodeproj

      选择“GTMSessionFetcher”项目并进行以下更改:

      • 添加类型为 iOS > Framework & Library> Cocoa Touch 静态库的新目标并将其命名为“GTMSessionFetcherLib”。
      • 将项目 GTMSessionFetcher 组中的所有 .m 文件添加到目标的 Build Phases > Compile Sources 部分。

      选择“GTL”项目的“GTLTouchStaticLib”目标并进行以下更改:

      • 将库 GTMSessionFetcher/libGTMSessionFetcherLib.a 添加到构建阶段 > 将二进制文件与库链接。
      • 将 gtm-session-fetcher/Source/ 的绝对路径添加到 Build Settings > User Header Search Paths。
      • 将标志 GTM_USE_SESSION_FETCHER=1 添加到 Build Settings > Preprocessor Macros。
      • 删除“GTL”项目的“GTLFramework”目标。
      • 在项目导航器中,删除 GTL 项目的 GTL Source > Common > HTTPFetcher 组。

      第 4 步:准备项目

      • 创建一个名为“QuickstartApp”的新 iOS > 应用程序 > 单一视图应用程序项目。将 Language 设置为 Swift ,并在保存项目时将 Add to 和 Group 字段设置为“Quickstart”。
      • 将以下框架和库添加到项目的 Build Phases > Link Binary with Libraries 部分: libGTLTouchStaticLib.a
        • Security.framework
        • SystemConfiguration.framework
      • 更改以下构建设置:
      • 将 -ObjC -all_load 添加到其他链接器标志。
      • 将以下目录的绝对路径添加到用户标头搜索路径:
        • gtm-session-fetcher/来源/
        • google-api-objectivec-client/Source/**
      • 将标志 GTM_USE_SESSION_FETCHER=1 添加到预处理器宏中。
      • 将文件 google-api-objectivec-client/Source/OAuth2/Touch/GTMOAuth2ViewTouch.xib 添加到项目的 Supporting Files 组。
      • 将以下文件添加到 QuickstartApp 组:
        • google-api-objectivec-client/Source/Services/Drive/Generated/GTLDrive_Sources.m
        • google-api-objectivec-client/Source/Services/Drive/Generated/GTLDrive.h
      • 如果没有自动创建,则新建一个头文件 Bridging-Header.h,内容如下:
        • #import "GTMOAuth2ViewControllerTouch.h"
        • #import "GTLDrive.h"
      • Set Build Settings > Objective-C Bridging Header 为桥接头的绝对路径。

      【讨论】:

      • 感谢您的回复。我只是试了一下,它有效。虽然它没有解决原来的问题,但既然它有效,我会暂时接受它。谢谢你。我不敢相信谷歌忽略了这一点。这个问题已经存在了几个月!
      • 谢谢@Isuru。我无法相信安装有多复杂。我敢肯定,一旦他们修改了代码,您的原始问题甚至可能会得到解决,这会更容易。正如你所说,这是一个长期存在的问题。
      • 是的。这可笑的复杂。我希望 Google 能够为他们的 iOS SDK 分发提供更多支持,因为他们明确表示他们将使用 CocoaPods 作为主要渠道。
      • @Daniel :-“选择“GTL”项目的“GTLTouchStaticLib”目标并进行以下更改:将库 GTMSessionFetcher/libGTMSessionFetcherLib.a 添加到 Build Phases > Link Binary with Libraries。”我没有找到 GTMSessionFetcher/libGTMSessionFetcherLib.a ,请详细说明这个问题!
      • @dip GTLTouchStaticLib target 应该在您项目中的 GTL 项目下可用。 libGTMSessionFetcherLib.a 来自项目中的 GTMSessionFetcher project。我知道这很难安装,但 Google 提供的说明是有效的。
      【解决方案3】:

      我发现的唯一解决方法是您必须进入 Google Drive 导入的这三个项目并检查导入是如何完成的。现在它的导入头文件,而不是框架(三个框架相互依赖)。您只需手动完成即可。

      我没有可向您展示的代码示例,但我知道我上次以这种方式让它工作。

      【讨论】:

      • three projects 是指Google-API-Clientgtm-http-fetchergtm-oauth2
      • 或者您的意思是在Podfile 中手动添加它们?我也试过了,但仍然出现同样的错误。
      • @isurur 你找到解决方案了吗?
      • 我的意思是这三个项目。您可以直接编辑项目。
      【解决方案4】:

      这里的简单解决方案:

      转到编辑方案 -> 选择构建 -> 构建选项取消选中并行构建

      现在运行您的应用程序

      【讨论】:

        猜你喜欢
        • 2012-05-30
        • 2014-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多