将Google Objective-C API 'GTL'添加到iPhone项目中

11

我该如何将Google Drive API添加到我的iPhone项目中以便我可以使用它?

目前,我已将GTL项目拖入我的当前应用程序项目中(使其嵌套在我的应用程序项目下)。然后,在我的应用程序目标的构建阶段中,我添加了GTL.framework,然后将GTL.framework添加到我的“链接二进制文件与库”中(参见附图)。这会引发以下错误:

clang: error: no such file or directory: '/Users/xxx/Library/Developer/Xcode/DerivedData/Golf-hfbczyaemhyzgvbrtgdxqnlzeuaa/Build/Products/Debug-iphonesimulator/GTL/GTL'
如何修复这个问题? enter image description here

1
经过3.5年,步骤仍然令人困惑和沮丧,难道Google的工程师们就不能让它更简单、更直接一些吗? :/ - rohan-patel
5个回答

25

我今天大部分时间都在努力解决这个问题,非常令人沮丧。最终我终于弄明白了,所以现在我来给大家提供一个简单的、逐步指导如何在iOS7项目中使用XCode5添加Google API的方法,使用ARC,而不需要创建工作区或其他东西。

RawMean提供的答案很好,但它给我的ARC带来了问题。我也不喜欢你必须添加项目、创建工作区然后删除项目这一事实。因此,我的解决方案将处理这两个问题。

  1. 检出代码。为此,您可以直接从终端运行svn checkout http://google-api-objectivec-client.googlecode.com/svn/trunk/ google-api-objectivec-client-read-only。我将称之为"谷歌代码"
  2. 进入您的项目的构建阶段。展开"Link Binary With Libraries"并添加Security.frameworkSystemConfiguration.framework。这两个是谷歌代码所需的。
  3. 进入您的项目的构建设置。使用其中的搜索框,查找Other Linker Flags(确保在搜索框左侧选择"All")。添加-ObjC -all_load
  4. 现在搜索User headers search path并添加到Goggle的/Source目录的完整路径。确保选择recursive
  5. 使用Finder,进入Google的/Source/OAuth2/Touch目录。将GTMOAuth2ViewTouch.xib拖放到您的项目中。
  6. 返回Finder并转到Google的/Source目录。将GTLCommon_Sources.mGTLCommon_Networking.m拖放到您的项目中。
  • 现在,你需要导入你想使用的服务的文件。以我为例,我需要使用Google Drive,因此我将添加它们。在Finder中,转到Google的/Source/Services/Drive/Generated目录。将GTLDrive.hGTLDrive_Sources.m拖放到您的项目中。如果您想使用其他服务,请转到它们的目录并导入相应的.h和.m文件。
  • 由于某种原因,Google的代码没有使用ARC,因此如果您现在尝试构建,您将会得到ARC编译错误。因此,我们需要仅对Google的代码禁用ARC。要执行此操作,请返回您项目的“Build Phases”,但这次展开“Compile Sources”。确保存在GTLCommon_Sources.mGTLCommon_Networking.m。选择它们,按Enter键并键入-fno-objc-arc。这将为它们都禁用ARC。确保不要为任何其他文件添加此选项(除非您知道自己在做什么)。
  • 完成了!现在,每当您想要使用Google的API时,只需导入GTMOAuth2ViewControllerTouch.h和您的服务头文件。以我为例,因为我正在使用Google Drive,所以我还将导入GTLDrive.h
  • 希望这可以帮助并挽救一些人的秃发问题。


    1
    对我有用。谢谢! - bvs
    2
    这适用于Swift,请查看我的答案以获取详细信息https://dev59.com/KGAf5IYBdhLWcg3w_G2r#24114960 - Ryan Heitner
    2
    你真是个绝对的救星!非常感谢你。在照着Google官方文档苦苦挣扎了2个小时后,终于让它正常工作了。再次感谢! - Salman Hasrat Khan
    2
    还要确保您进入“GTLNetworking_Sources”类并将GTMOAuth2ViewControllerTouch.m更改为GTMOAuth2ViewControllerTouch.h。 - What what
    1
    当所有其他答案都失败了,你拯救了我! - technophyle
    我按照你的步骤操作,因为你非常细致,这在stackoverflow上很难找到。很抱歉它没有帮助到我,但是对于良好的指导写作,我给你点赞。 - Boris Gafurov

    14

    我也遇到了这个错误消息,在此分享解决方法:

    确保您已将使用的服务文件夹添加到GTLSource/Common/下(例如,为GoogleDrive添加Drive文件夹)。

    在您已将其添加到工作区的GTL.xcodeproj中,找到GTLSource文件夹并将其拖到主项目(在您的情况下是Golf)中。完成!

    现在,您可以删除您添加到工作区的GTL.xcodeproj的引用。

    使用此方法,您甚至不需要添加库(如果您已添加它们,请从链接库列表中删除它们)。

    谷歌API文档与苹果公司的文档完全不同(不太好)。

    我还应该提到,我正在为iOS构建应用程序,而不是MacOSX,但是这对于MacOSX也可以正常工作。

    输入图片描述


    6
    我又遇到了这个问题,忘记了之前已经解决过它,结果来到了这个页面,却没有意识到我其实已经发布了这个解决方案 :) - RawMean
    1
    使用Swift解决方案,请参考Rob的答案并查看我的https://dev59.com/KGAf5IYBdhLWcg3w_G2r#24114960 - Ryan Heitner
    @RawMean,你是什么意思:“确保您已将您正在使用的服务的文件夹添加到GTLSource/Common/中(例如,为GoogleDrive添加Drive文件夹)。” 那个Drive文件夹里面应该包含什么? - Boris Gafurov
    非常感谢,它起作用了,尽管它抱怨“OSX xibs不支持目标设备'ipad'”(我使用XCode7.1.1)- 我只是删除了GTL Source \ Common \ OAuth2中Mac文件夹的引用,只留下Touch。 - Boris Gafurov
    @BorisGafurov 如果您正在使用GoogleDrive,则Drive文件夹应包含与GoogleDrive服务对应的SDK文件。另一种说法是,您可以删除除实际使用的谷歌服务之外的所有谷歌服务文件夹(以减小应用程序的大小)。关于删除对Mac文件夹的引用:是的,那也是我为了摆脱那个错误而做的。 - RawMean

    1

    最好使用Pod

    1. 如何安装CocoaPods并与您的Xcode项目进行设置,请参考:[http://blogs.triffort.com/?p=309][1]
    2. 打开pod文件并添加

      pod 'Google-API-Client/Drive', '~> 1.0' 在终端中保存pod文件并调用pod install。注意:您必须在此行后面给出link_with 'Your_project_name','Your_project_nameTests',然后才能添加您的库。


    你是如何使用CocoaPods导入GTMOAuth2ViewControllerTouch.hGTLDrive.h文件到你的项目中的?我无法使用任何import语句,也找不到应该导入哪个模块。 - KVISH
    @KVISH:你现在做了什么?你打开了.workspace还是.xcodeproject文件? - Adarsh G J
    这是一个旧答案,请使用官方的Pod。请参见:https://github.com/google/google-api-objectivec-client/issues/103#issuecomment-202017387 - emem

    1
    不仅要执行上述操作,还需要进入“[项目名称]目标->构建阶段->编译源代码”并单击+按钮。然后添加所有.m文件,由于某种原因,大多数文件没有自动添加。
    我还不得不从Drive文件夹中删除对“GTLDrive_Souces.m”的引用,但我不明白为什么我必须这样做。

    “不只做上面的事情?” 我不明白你的意思。有很多东西在你的回答之上。 - Kaydell

    1

    这并不能真正解决安装Google API的问题,但在这个仓库中,我通过不使用Google的API从iOS应用程序访问了Google表单。 https://github.com/goktugyil/QorumLogs

    因此,在某些项目中,您可以跳过安装API部分

    以下是设置教程:https://github.com/goktugyil/QorumLogs/blob/master/Log%20To%20GoogleDocs.md

    以下是代码:

    private static var googleFormLink: String!
    private static var googleFormAppVersionField: String!
    private static var googleFormUserInfoField: String!
    private static var googleFormMethodInfoField: String!
    private static var googleFormErrorTextField: String!
    
    /// Setup Google Form links
    static func setupOnlineLogs(#formLink: String, versionField: String, userInfoField: String, methodInfoField: String, textField: String) {
        googleFormLink = formLink
        googleFormAppVersionField = versionField
        googleFormUserInfoField = userInfoField
        googleFormMethodInfoField = methodInfoField
        googleFormErrorTextField = textField
    }
    
    private static func sendError(#text: String) {
        var url = NSURL(string: googleFormLink)
        var postData = googleFormAppVersionField + "=" + text
        postData += "&" + googleFormUserInfoField + "=" + "anothertext"                
        postData += "&" + googleFormMethodInfoField + "=" + "anothertext" 
        postData += "&" + googleFormErrorTextField + "=" + "anothertext" 
    
        var request = NSMutableURLRequest(URL: url!)
        request.HTTPMethod = "POST"
        request.setValue("application/x-www-form-urlencoded; charset=utf-8", forHTTPHeaderField: "Content-Type")
        request.HTTPBody = postData.dataUsingEncoding(NSUTF8StringEncoding)
        var connection = NSURLConnection(request: request, delegate: nil, startImmediately: true)
    }
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接