是否有人设法在Swift项目中使用Google Drive Api(对象C)
https://developers.google.com/drive/ios/quickstart
我尝试了多种方法,但是无法编译
我最接近的是在下面的链接中使用Rob的方法,并将#import“ GTLDrive.h”添加到BridgingHeader中。这使我可以创建GTLDrive,但不能创建Auth,因为我无法让Xcode注意No ARC标志。
并添加带有bridging-header.h文件
#import "GTLDrive.h" #import "GTMOAuth2ViewControllerTouch.h"
为了节省时间,我将我的Objective-C包含在Google快速入门中的示例的Swift Translation中
iOS版Google云端硬盘快速入门
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() } }