用Objective-C API“GTL”用Swift

有没有人设法在Swift Project中使用Google Drive Api(Objjective C)

https://developers.google.com/drive/ios/quickstart

我已经尝试了很多不同的方式,但不能编译它

最接近的是在下面的链接中使用Rob的方法,并在BridgingHeader中添加#import“GTLDrive.h”。 这让我创build一个GTLDrive,但不是Auth,因为我无法让Xcode注意到无ARC标志。

Stackoverflow 11370752

我最终设法通过以下来做到这一点

堆栈溢出11370752

并添加一个bridging-header.h文件

#import "GTLDrive.h" #import "GTMOAuth2ViewControllerTouch.h" 

为了节省一些时间,我将我的Objective-C包含到Google Quickstart中包含的示例的Swift翻译中

适用于Google云端硬盘的IOS快速入门

 import UIKit import MobileCoreServices class ViewController: UIViewController , UINavigationControllerDelegate ,UIImagePickerControllerDelegate { var window: UIWindow? let driveService : GTLServiceDrive = GTLServiceDrive() let kKeychainItemName : NSString = "Google Drive Quickstart" let kClientID : NSString = "Your Client ID" let kClientSecret : NSString = "Your Secret" func showWaitIndicator(title:String) -> UIAlertView { // println("showWaitIndicator \(title)") var progressAlert = UIAlertView() progressAlert.title = title progressAlert.message = "Please Wait...." progressAlert.show() let activityView = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.White) activityView.center = CGPointMake(progressAlert.bounds.size.width / 2, progressAlert.bounds.size.height - 45) progressAlert.addSubview(activityView) activityView.hidesWhenStopped = true activityView.startAnimating() return progressAlert } override func viewDidLoad() { super.viewDidLoad() self.driveService.authorizer = GTMOAuth2ViewControllerTouch.authForGoogleFromKeychainForName(kKeychainItemName, clientID: kClientID, clientSecret: kClientSecret) } override func viewDidAppear(animated: Bool) { self.showCamera() } func showCamera() { var cameraUI = UIImagePickerController() if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera) { cameraUI.sourceType = UIImagePickerControllerSourceType.Camera } else { cameraUI.sourceType = UIImagePickerControllerSourceType.PhotoLibrary if UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Pad { self.showAlert("Error", message: "Ipad Simulator not supported") return } } cameraUI.mediaTypes = [kUTTypeImage as String] cameraUI.allowsEditing = true cameraUI.delegate = self self.presentModalViewController(cameraUI, animated: true) println("Show Camera \(self.isAuthorized())") if (!self.isAuthorized()) { // Not yet authorized, request authorization and push the login UI onto the navigation stack. cameraUI.pushViewController(self.createAuthController(), animated:true); } } // Handle selection of an image func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info:NSDictionary) { println("imagePickerController didFinishPickingMediaWithInfo") let image = info.valueForKey(UIImagePickerControllerOriginalImage) as UIImage self.dismissModalViewControllerAnimated(true) self.uploadPhoto(image) } // Handle cancel from image picker/camera. func imagePickerControllerDidCancel(picker: UIImagePickerController){ self.dismissModalViewControllerAnimated(true) } // Helper to check if user is authorized func isAuthorized() -> Bool { return (self.driveService.authorizer as GTMOAuth2Authentication).canAuthorize } // Creates the auth controller for authorizing access to Google Drive. func createAuthController() -> GTMOAuth2ViewControllerTouch { return GTMOAuth2ViewControllerTouch(scope: kGTLAuthScopeDriveFile, clientID: kClientID, clientSecret: kClientSecret, keychainItemName: kKeychainItemName, delegate: self, finishedSelector: Selector("viewController:finishedWithAuth:error:")) } // “func join(string s1: String, toString s2: String, withJoiner joiner: String)” // Handle completion of the authorization process, and updates the Drive service // with the new credentials. func viewController(viewController: GTMOAuth2ViewControllerTouch , finishedWithAuth authResult: GTMOAuth2Authentication , error:NSError ) { if error != nil { self.showAlert("Authentication Error", message:error.localizedDescription) self.driveService.authorizer = nil } else { println("Authentication success") self.driveService.authorizer = authResult } } // Uploads a photo to Google Drive func uploadPhoto(image: UIImage) { println("uploading Photo") let dateFormat = NSDateFormatter() dateFormat.dateFormat = "'Quickstart Uploaded File ('EEEE MMMM d, YYYY h:mm a, zzz')" let file = GTLDriveFile.object() as GTLDriveFile file.title = dateFormat.stringFromDate(NSDate()) file.descriptionProperty = "Uploaded from Google Drive IOS" file.mimeType = "image/png" let data = UIImagePNGRepresentation(image) let uploadParameters = GTLUploadParameters(data: data, MIMEType: file.mimeType) let query = GTLQueryDrive.queryForFilesInsertWithObject(file, uploadParameters: uploadParameters) as GTLQueryDrive let waitIndicator = self.showWaitIndicator("Uploading To Google Drive") // self.driveService.executeQuery(query, completionHandler: {(ticket: GTLServiceTicket, insertedFile: AnyObject, error: NSError) in { // // // } // elf.driveService.executeQuery(<#query: GTLQueryProtocol?#>, completionHandler: <#((GTLServiceTicket!, AnyObject!, NSError!) -> Void)?#>) self.driveService.executeQuery(query, completionHandler: { (ticket, insertedFile , error) -> Void in let myFile = insertedFile as? GTLDriveFile waitIndicator.dismissWithClickedButtonIndex(0, animated: true) if error == nil { println("File ID \(myFile?.identifier)") self.showAlert("Google Drive", message: "File Saved") } else { println("An Error Occurred! \(error)") self.showAlert("Google Drive", message: "Sorry, an error occurred!") } }) } func showAlert(title: String, message: String ) { let cancel = "OK" println("show Alert") let alert = UIAlertView() alert.title = title alert.message = message alert.addButtonWithTitle(cancel) alert.show() } } 

更好地使用Pod来添加Google Objective-C API GTL到iPhone项目请参考这个链接之后,你可以实现@Ryan Heitner的答案

这个问题并不是一个真正的答案,但是在这个回购中,我从iOS应用程序访问Google表单而不使用Google的API。 https://github.com/goktugyil/QorumLogs

这里是如何设置它的教程: https : //github.com/goktugyil/QorumLogs/blob/master/Log%20To%20GoogleDocs.md

inheritance人的代码做到这一点:

 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) }