类“GTMHTTPUploadFetcher”的重复接口定义

我打算在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窗格转换为Swift框架而不是静态库。

Pod安装成功。 但是,当我build立项目,我得到以下错误。

类“GTMHTTPUploadFetcher”的重复接口定义

删除DerivedData文件夹并清理项目不起作用。

我也尝试不添加use_frameworks! 然后通过桥接头的方式添加库。 这没有问题。 事情是所有我的其他依赖与它打开工作。 不幸的是CocoaPods 不 支持只为某些豆荚转换该标志。

有没有解决这个问题的解决方法?


正如谷歌的文档所述 ,谷歌的工程师们应该可以监控google-drive-sdk的问题,所以我希望至less他们能够看到这个问题并尽快解决。

我遇到了同样的问题。 我的解决scheme是使用CocoaPods为iOS 安装 Google API Client,因为我使用的是基于Swift的Pod,所以我无法删除use_frameworks! 试图解决重复的头问题。

我按照https://developers.google.com/drive/ios/quickstart?ver=swift上步骤2,步骤3和步骤4的详细说明手动安装了库。我按照说明将其应用于现有的工作区而不是创build新的工作区。

请注意,我必须调整“ 用户标题searchpath”中的path,以匹配我实际从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并创build一个名为“Quickstart”的新工作空间。 使用“文件”>“将文件添加到”“快速入门”…,将以下项目添加到您在上一步中克隆的库中的工作区中:

  • 谷歌-API的ObjectiveC客户/来源/ GTL.xcodeproj
  • GTM-会话提取器/来源/ GTMSessionFetcher.xcodeproj

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

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

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

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

步骤4:准备项目

  • 创build一个名为“QuickstartApp”的新的iOS> Application> Single View Application项目。 将语言设置为Swift,保存项目时,将“添加到”和“组”字段设置为“快速启动”。
  • 将以下框架和库添加到项目的Build Phases> Link Binary with Libraries部分:libGTLTouchStaticLib.a
    • Security.framework
    • SystemConfiguration.framework
  • 更改以下生成设置:
  • 添加-ObjC -all_load到其他链接器标志。
  • 将以下目录的绝对path添加到用户标题searchpath:
    • GTM-会话提取器/来源/
    • 谷歌-API的ObjectiveC客户/来源/ **
  • 将标志GTM_USE_SESSION_FETCHER = 1添加到预处理器macros。
  • 将文件google-api-objectivec-client / Source / OAuth2 / Touch / GTMOAuth2ViewTouch.xib添加到项目的支持文件组中。
  • 将以下文件添加到QuickstartApp组:
    • 谷歌-API的ObjectiveC客户/来源/服务/驱动器/生成/ GTLDrive_Sources.m
    • 谷歌-API的ObjectiveC客户/来源/服务/驱动器/生成/ GTLDrive.h
  • 如果没有自动创build,则使用以下内容创build一个新的头文件Bridging-Header.h:
    • #import "GTMOAuth2ViewControllerTouch.h"
    • #import "GTLDrive.h"
  • 将“生成设置”>“Objective-C桥接头”设置为桥接头的绝对path。

根据谷歌,这个错误是由第三方使用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 'GTMOAuth2' pod 'Google/SignIn'

我发现唯一的解决方法是,您必须进入Google Drive导入的三个项目,并检查导入是如何完成的。 现在它的导入头,而不是框架(三个框架相互依赖)。 你必须手动做,它会工作。

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

简单的解决scheme:

转到编辑scheme – >select生成 – >生成选项取消并行生成

现在运行你的App