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

时间:2012-07-06 23:09:16

标签: objective-c xcode api sdk google-drive-api

如何将Google云端硬盘API添加到我的iPhone项目中,我可以使用它吗?

到目前为止,我已将GTL项目拖入我当前的应用程序项目中(因此它嵌套在我的应用程序项目中)。然后,在我的应用程序目标的构建阶段,我添加了GTL.framework,然后将GTL.framework添加到我的'Link binary with Libraries'(参见附图)。这会引发以下错误:

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

5 个答案:

答案 0 :(得分:25)

今天大部分时间我都在努力解决这个问题,我觉得非常令人沮丧。我终于弄明白了,所以这里有一个简单的分步指南,介绍如何使用ARC将iOS API添加到使用XCode5的iOS7项目,而无需创建工作空间或其中任何一个。

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

  1. 查看代码。为此,您只需从终端运行svn checkout http://google-api-objectivec-client.googlecode.com/svn/trunk/ google-api-objectivec-client-read-only即可。我将此代码称为“Google的代码”
  2. 转到项目的构建阶段。展开“使用库链接二进制文件”并添加Security.frameworkSystemConfiguration.framework。这两个是Google代码所必需的。
  3. 转到项目的构建设置。使用那里的搜索框,查找Other Linker Flags(确保在搜索框的左侧选择“全部”)。添加-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拖放到项目中。
  7. 现在,您需要导入要使用的服务的文件。在我的情况下,我需要使用Google云端硬盘,所以我会添加它们。在Finder中,转到Google的/Source/Services/Drive/Generated目录。将GTLDrive.hGTLDrive_Sources.m拖放到项目中。如果要使用其他服务,请转到其目录并导入相应的.h和.m文件。
  8. 出于某种原因,Google的代码不使用ARC,因此如果您现在尝试构建,则会出现ARC编译错误。因此,我们需要仅为Google代码禁用ARC 。为此,请返回项目的Build Phases,但这次展开“Compile Sources”。确保GTLCommon_Sources.mGTLCommon_Networking.m在那里。选择它们,按enter并键入-fno-objc-arc。这将禁用它们的ARC。确保不要为任何其他文件添加此选项(除非您知道自己在做什么)。
  9. 你完成了!现在,只要您想使用Google的API,只需导入GTMOAuth2ViewControllerTouch.h和您的服务标头即可。就我而言,由于我使用的是Google云端硬盘,我还会导入GTLDrive.h
  10. 我希望能帮助并拯救一些人不要拔掉头发。

答案 1 :(得分:14)

我也在努力解决此错误消息。这就是我解决它的方法:

确保您已在GTLSource / Common /下添加了您正在使用的服务的文件夹(例如,为GoogleDrive添加云端硬盘文件夹)。

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

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

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

Google API文档与Apple的文档完全不同(它并不好)。

我还应该提一下,我正在为iOS而不是MacOSX构建应用程序,但这也适用于OSX。

enter image description here

答案 2 :(得分:1)

不仅要执行上述操作,还要进入“[Project Name] Targets-> Build Phases> Compile Sources”并单击+按钮。然后添加所有.m文件,由于某些原因大多数都不是自动的。

我还必须从Drive文件夹中删除(引用)“GTLDrive_Souces.m”,但我不明白为什么我必须这样做。

答案 3 :(得分:1)

  

最好使用Pod

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

         

    pod'Google-API-Client / Drive','〜> 1.0'保存pod文件并在终端中调用pod install。注意:pod文件必须提供link_with   'your_project_name','Your_project_nameTests'仅在此行之后添加   你的图书馆

  4.   

答案 4 :(得分:1)

这并没有真正解决安装Google API的问题,但是在这个回购中我从iOS应用程序访问了Google Forms而没有使用Google的API。 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)
}