Has anyone managed to use the Google Drive Api (Objjective C) in a Swift Project
https://developers.google.com/drive/ios/quickstart
I have tried a number of different ways but cannot get it to compile
The closest I came was using Rob's methodology in the link below and adding #import "GTLDrive.h" to the BridgingHeader. This allowed me to create a GTLDrive but not the Auth becauser I could not get Xcode to pay attention to the No ARC flags.
Stackoverflow 11370752
I eventually managed to do this by following
Stack OverFlow 11370752
and adding a bridging-header.h file with
#import "GTLDrive.h"
#import "GTMOAuth2ViewControllerTouch.h"
To save someone time I include my Objective-C to Swift Translation of the sample included in the Google Quickstart
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()
}
}
                        Better to use Pod for Adding Google Objective-C API 'GTL' to iPhone project refer this link After that you can implement @Ryan Heitner answer
Not really an answer to this question but in this repo I accessed Google Forms from an iOS app without using Google's API. https://github.com/goktugyil/QorumLogs
Here is the tutorial of how to set it up: https://github.com/goktugyil/QorumLogs/blob/master/Log%20To%20GoogleDocs.md
Heres the code to do it:
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)
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With