类'GTMHTTPUploadFetcher'的重复接口定义

问题描述:

我计划在我的Swift项目中使用Google Drive API。我试图通过CocoaPods添加Drive SDK(v0.39.0)。以下是我的Podfile。类'GTMHTTPUploadFetcher'的重复接口定义

platform :ios, '8.0' 
use_frameworks! 

pod 'Google-API-Client/Drive' 

我已经加入了use_frameworks!标志,这样的CocoaPods可以Objective-C的豆荚转化为斯威夫特框架,而不是静态库。

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

删除DerivedData文件夹和清洁项目没有工作

重复的接口定义。

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

有没有解决此问题的解决方法?


正如谷歌的docs指出,谷歌的工程师据称监控标记与谷歌驱动-SDK的问题,所以我希望至少他们会看到这一点,并尽快修复它。

我遇到了同样的问题。我的解决方案是没有安装谷歌API客户端为iOS使用CocoaPods因为我使用基于Swift的豆荚,因此,我不能删除use_frameworks!试图解决重复标题问题。

我代替手动安装库通过在https://developers.google.com/drive/ios/quickstart?ver=swift以下对步骤2,3中的详细说明,以及4.我按照说明,但应用于他们我的现有工作空间而不是创建新的工作空间的。

请务必注意,我必须调整用户标题搜索路径中的路径,以匹配我实际从Google复制源代码的位置。

我在这里复制说明以供参考。

第2步:下载的谷歌客户端库

运行以下命令使用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和创建一个名为 “快速启动” 新的工作空间。 使用文件>将文件添加到“快速入门” ......,从你在上一步克隆库中添加以下项目到工作区:

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

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

  • 添加t的新目标他键入iOS> Framework & Library> Cocoa Touch Static Library并将其命名为“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”目标。
  • 在Project导航器中,删除GTL项目的GTL Source> Common> HTTPFetcher组。

第4步:准备项目

  • 创建一个新的iOS>应用程序>单查看应用程序名为 “QuickstartApp” 项目。将语言设置为Swift,并在保存项目时将添加到和组字段设置为“快速启动”。
  • 添加以下框架和库到项目的构建阶段>链接二进制与库部分: libGTLTouchStaticLib.a
    • Security.framework
    • SystemConfiguration.framework
  • 更改以下构建设置:
  • 将-ObjC -all_load添加到其他链接器标志。
  • 绝对路径添加到以下目录到用户头搜索路径:
    • GTM-会话提取器/来源/
    • 谷歌-API的ObjectiveC客户/来源/ **
  • 将标志GTM_USE_SESSION_FETCHER = 1添加到预处理器宏。
  • 将文件google-api-objectivec-client/Source/OAuth2/Touch/GTMOAuth2ViewTouch.xib添加到项目的支持文件组中。
  • 将下列文件添加到QuickstartApp组:
    • 谷歌-API的ObjectiveC客户/来源/服务/驱动器/生成/ GTLDrive_Sources.m
    • 谷歌-API的ObjectiveC客户/来源/服务/Drive/Generated/GTLDrive.h
  • 如果没有自动创建,创建一个新的头文件转职Header.h具有以下内容:
    • #import "GTMOAuth2ViewControllerTouch.h"
    • #import "GTLDrive.h"
  • 集构建设置> Objective-C的桥接报头到桥接报头的绝对路径。
+0

感谢您的回复。我只是试了一下就行了。虽然它不能解决最初的问题,但由于它的工作原理,我暂时会接受它。谢谢。我不相信Google会忽略这一点。这个问题已经存在好几个月了! – Isuru

+0

谢谢@Isuru。我无法相信它的安装有多复杂。我相信一旦他们修改了代码,它会更容易,而且您的原始问题甚至可能会得到修复。像你说的那样,这是一个长期存在的问题。 – Daniel

+0

是的。这是非常复杂的。我希望谷歌提供更多支持来分发他们的iOS SDK,因为他们明确表示他们将使用CocoaPods作为主要渠道。 – Isuru

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

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

+0

通过[三个项目(http://i.imgur.com/i34BYio。png),你的意思是'Google-API-Client','gtm-http-fetcher'和'gtm-oauth2'吗? – Isuru

+0

还是你的意思是在['Podfile'](http://pastie.org/10540347)中手动添加它们?我也试过,但仍然得到相同的错误。 – Isuru

+0

@isurur你找到了解决办法吗? –

据谷歌这个错误是通过使用cocoapod由第三方造成的,但他们现在已经在项目(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'

简单的解决方案在这里:

去编辑方案 - >选择Build - >构建选项的勾去掉了并行化编译

现在运行你的应用程序