有没有人设法在Swift项目中使用Google Drive Api(Objjective C)
https://developers.google.com/drive/ios/quickstart
我尝试了很多不同的方法,但无法编译
我最接近的是在下面的链接中使用Rob的方法并添加#import" GTLDrive.h"到BridgingHeader。这让我可以创建一个GTLDrive而不是Auth因为我无法让Xcode注意No ARC标志。
答案 0 :(得分:14)
我最终通过以下
成功完成了这项工作并添加带有
的bridging-header.h文件#import "GTLDrive.h"
#import "GTMOAuth2ViewControllerTouch.h"
为节省时间,我将Objective-C包含在Google快速入门中包含的示例的Swift Translation中
IOS Quickstart for Google Drive
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()
}
}
答案 1 :(得分:1)
最好使用Pod将Google Objective-C API'GTL'添加到iPhone项目中 参考这个link 之后,您可以实施@Ryan Heitner答案
答案 2 :(得分:1)
这个问题不是真正的答案,但是在这个回购中,我从iOS应用程序访问了Google表单,而没有使用Google的API。 https://github.com/goktugyil/QorumLogs
以下是如何设置它的教程: https://github.com/goktugyil/QorumLogs/blob/master/Log%20To%20GoogleDocs.md
继承代码:
SELECT a.test, b.test FROM (
IF EXISTS
(SELECT test FROM Table_test WHERE test='test1')
SELECT test FROM Table_test WHERE test='test1'
ELSE
SELECT test='NONE') a
CROSS JOIN
(SELECT test FROM Table_test WHERE test='test2') b;