类' GTMHTTPUploadFetcher'

时间:2015-11-07 10:47:26

标签: ios swift google-drive-api cocoapods

我打算在我的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仅为某些豆荚转动了旗帜。

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

正如Google docs所述,谷歌工程师据称可以监控使用google-drive-sdk标记的问题,所以我希望至少他们会看到这一点并尽快解决。

4 个答案:

答案 0 :(得分:4)

根据谷歌的说法,这个错误是由第三方使用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'

答案 1 :(得分:3)

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

我通过执行https://developers.google.com/drive/ios/quickstart?ver=swift中有关步骤2,3和4的详细说明手动安装了库。我按照说明操作但将其应用于我现有的工作区而不是创建一个新的工作空间。

请务必注意,我必须调整用户标题搜索路径中的路径,以匹配我实际从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”的新工作区。   使用文件>将文件添加到“快速启动”...,将以下项目添加到您在上一步中克隆的库中的工作区:

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

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

     
      
  • 添加iOS>类型的新目标框架&图书馆> Cocoa Touch Static Library并将其命名为“GTMSessionFetcherLib”。
  •   
  • 将项目的GTMSessionFetcher组中的所有.m文件添加到目标的Build Phases>编译来源部分。
  •   
     

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

     
      
  • 将库GTMSessionFetcher / libGTMSessionFetcherLib.a添加到Build Phases> Link Binary与Libraries。
  •   
  • 将gtm-session-fetcher / Source /的绝对路径添加到Build Settings>用户标题搜索路径。
  •   
  • 将标志GTM_USE_SESSION_FETCHER = 1添加到构建设置>预处理器宏。
  •   
  • 删除“GTL”项目的“GTLFramework”目标。
  •   
  • 在项目导航器中,删除GTL项目的GTL源>常见> HTTPFetcher组。
  •   
     

第4步:准备项目

     
      
  • 创建新的iOS>申请>单视图应用程序项目名为“QuickstartApp”。将语言设置为Swift,保存项目时,将“添加到”和“组”字段设置为“快速启动”。
  •   
  • 将以下框架和库添加到项目的Build Phases> Link Binary with Libraries部分:   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的客户端/源/服务/驱动器/生成/ GTLDrive.h
    •   
  •   
  • 如果未自动创建,请使用以下内容创建新的头文件Bridging-Header.h:      
        
    • #import "GTMOAuth2ViewControllerTouch.h"
    •   
    • #import "GTLDrive.h"
    •   
  •   
  • 设置构建设置> Objective-C将标题桥接到桥接标题的绝对路径。
  •   

答案 2 :(得分:0)

我发现的唯一解决方法是您必须进入Google云端硬盘导入的三个项目并检查导入的执行方式。现在它的导入头,而不是框架(三个框架相互依赖)。你必须手动完成它才能工作。

我没有代码示例给你看,但我知道我上次以这种方式工作了。

答案 3 :(得分:0)

这里的简单解决方案:

转到编辑方案 - >选择Build - >构建选项取消勾选Parallelize Build

现在运行你的应用程序