We already have a login module uses Google Sign-In sdk. Google Sign-In gives a GIDAuthentication object after login succeed.
Now I want to access user\'s google dri
Yes you can!
Use the following steps:
Follow all the steps to add Google SignIn as described in: https://developers.google.com/identity/sign-in/ios/start-integrating. Make sure you enable the Google Drive API for your project.
When initialising the sign-in object, don't forget to add the Google Drive API scope:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Initialize sign-in
var configureError: NSError?
GGLContext.sharedInstance().configureWithError(&configureError)
assert(configureError == nil, "Error configuring Google services: \(configureError)")
GIDSignIn.sharedInstance().delegate = self
// Use here whatever auth scope you wish (e.g., kGTLAuthScopeDriveReadonly,
// kGTLAuthScopeDriveMetadata, etc..)
// You can obviously append more scopes to allow access to more services,
// other than Google Drive.
GIDSignIn.sharedInstance().scopes.append(kGTLAuthScopeDrive)
return true
}
In your AppDelegate
(or some other accessible place), add:
var myAuth: GTMFetcherAuthorizationProtocol? = nil
In you signIn
delegate function (assuming here it is also set in AppDelegate
), add the following code:
func signIn(signIn: GIDSignIn!, didSignInForUser user: GIDGoogleUser!, withError error: NSError!) {
if (error == nil) {
// Logged into google services successfully!
// Save relevant details from user.authentication to refresh the token when needed.
// Set GTMOAuth2Authentication authoriser for your Google Drive service
myAuth = user.authentication.fetcherAuthorizer()
} else {
// Error signing into Google services
}
}
Last, wherever you set your GoogleServiceDrive, you can also set its authoriser, simply by setting:
let service = GTLServiceDrive()
service.authorizer = (UIApplication.sharedApplication().delegate as! AppDelegate).myAuth
Now you can use the example code by Google
if let authorizer = service.authorizer, canAuth = authorizer.canAuthorize where canAuth {
// service is authorised and can be used for queries
} else {
// service is not authorised
}
/ Creates the auth controller for authorizing access to Google Drive.
- (GTMOAuth2ViewControllerTouch *)createAuthController
{
GTMOAuth2ViewControllerTouch *authController;
authController = [[GTMOAuth2ViewControllerTouch alloc] initWithScope:@"https://www.googleapis.com/auth/drive"
clientID:kClientID
clientSecret:kClientSecret
keychainItemName:kKeychainItemName
delegate:self
finishedSelector:@selector(viewController:finishedWithAuth:error:)];
return authController;
}
// Handle completion of the authorization process, and updates the Drive service
// with the new credentials.
- (void)viewController:(GTMOAuth2ViewControllerTouch *)viewController
finishedWithAuth:(GTMOAuth2Authentication *)authResult
error:(NSError *)error
{
if (error != nil)
{
[self showAlert:@"Authentication Error" message:error.localizedDescription];
self.driveService.authorizer = nil;
}
else
{
self.driveService.authorizer = authResult;
[self.navigationController dismissViewControllerAnimated:YES completion:nil];
}
}-(void)loadDriveFiles
{
NSMutableArray *driveFiles = [[NSMutableArray alloc] init];
NSMutableArray *downloadFiles = [[NSMutableArray alloc] init];
GTLQueryDrive *query = [GTLQueryDrive queryForFilesList];
query.q = [NSString stringWithFormat:@"'%@' IN parents", @"root"];
[self.driveService executeQuery:query completionHandler:^(GTLServiceTicket *ticket,
GTLDriveFileList *files,
NSError *error) {
if (error == nil)
{
for(id key in files.items) {
NSString *titleStr = [key valueForKey:@"title"];
[driveFiles addObject:titleStr];
NSString *downloadStr = [key valueForKey:@"downloadUrl"];
[downloadFiles addObject:downloadStr];
}
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
FilesViewController *filesView = (FilesViewController *)[storyboard instantiateViewControllerWithIdentifier:@"filesView"];
[filesView initwithName:driveFiles anddownload:downloadFiles];
[self.navigationController pushViewController:filesView animated:YES];
}
else
{
NSLog(@"An error occurred: %@", error);
}
}];
}