Huớng dẫn cách nhúng Google Drive SDK vào project ios

Hôm nay mình sẽ giới thiệu với các bạn cách nhúng google drive SDK vào project do có 1 số thay đổi về chính sách của google cho nên hiện tại cách nhúng SDk vào project hơi phức tạp 1 chút. Mình sẽ nói thêm 1 chút về sự thay đổi này trong bài viết này.

Giới Thiệu Về Google drive SDK

Google drive cung cấp cho các bạn các thư viện API, cho phép các bạn phát triển các app cho phép read write lên google drive cloud của user. Bạn có thể search, share, open, upload, download file mà user đã upload lên google drive. Do google drive cho free 15GB nên đồng thời các bạn có thể phát triển các app lưu trữ dữ liệu liên quan đến google drive khá là hay và tiện lợi.

Cài Đặt SDK

Tạo project trên google developers console Có 2 thứ bạn phải lấy được từ Google API Console là ClientIDCustom URI Scheme

  • Các bạn truy cập https://console.developers.google.com/start/api?id=drive tạo project ios với tên và bundle identifier project ios của bạn sau đó cài dặt theo hình sau

  • Sau đó các bạn có được ClientIDCustom URI Scheme như hình vẽ trên Client ID = 326466930866-q3bkaqkesc76epod6asmjqqrslluha3u.apps.googleusercontent.com iOS URL scheme = com.googleusercontent.apps.326466930866-q3bkaqkesc76epod6asmjqqrslluha3u

Nguyên Tắc Hoạt Động Của API

Tạo Project

  • Nguyên tắc hoạt động của API:

  • Do mình khai báo trên google API console bundle app của mình là DA.GoogleDriveSDKTest cho nên mình phải tạo project với bundle đó

  • Tạo file cocoa pod và pod install để tạo workspace:

    source 'https://github.com/CocoaPods/Specs.git'
     platform:ios, "7.0"
     target 'GoogleDriveSDKTest' do
          pod 'GoogleAPIClientForREST/Drive', '~> 1.1.1'
          pod 'GTMAppAuth'
     end
    
  • Các bạn thêm custom URL schemes sau khi lấy được từ google developers console vào project để sau khi login xong google sẽ call lại app của bạn dựa theo URL này: như app của mình là com.googleusercontent.apps.326466930866-q3bkaqkesc76epod6asmjqqrslluha3u

  • Có 2 bước để nhúng google drive SDK là nhúng oauth để user login và nhúng google drive sdk để access file.

  • Nhúng ouath:

  • Các bạn khai báo constant : static NSString *const kClientID = @"326466930866-q3bkaqkesc76epod6asmjqqrslluha3u.apps.googleusercontent.com"; //là client ID có được từ google developers console ``

  • Các bạn khai báo oauth endpoint đến và token exchange endpoint:

        NSURL *authorizationEndpoint = [NSURL URLWithString:@"https://accounts.google.com/o/oauth2/v2/auth"];
        NSURL *tokenEndpoint =  [NSURL URLWithString:@"https://www.googleapis.com/oauth2/v4/token"];
        OIDServiceConfiguration *configuration = [[OIDServiceConfiguration alloc] initWithAuthorizationEndpoint:authorizationEndpoint tokenEndpoint:tokenEndpoint];
    
  • Các bạn khởi tạo request login:

         [[OIDAuthorizationRequest alloc] initWithConfiguration:configuration
                                                    clientId:kClientID
                                                clientSecret:@""
                                                      scopes:@[OIDScopeOpenID, OIDScopeProfile,kGTLRAuthScopeDrive]
                                                 redirectURL:[NSURL URLWithString:@"com.googleusercontent.apps.326466930866-q3bkaqkesc76epod6asmjqqrslluha3u:/oauthredirect"]
                                                responseType:OIDResponseTypeCode
                                        additionalParameters:nil];
    

    Trong đó param scopes là qui định permission của login trong trường hợp sử dụng google drive SDK các bạn phải thêm kGTLRAuthScopeDrive redirectURL là custom url scheme + :/oauthredirect mà bạn đã lấy được trên google developers console

  • Request login:

       [OIDAuthState authStateByPresentingAuthorizationRequest:request presentingViewController:self.secondVC callback:^(OIDAuthState * _Nullable authState, NSError * _Nullable error) {
             if (authState) {
                 // Creates the GTMAppAuthFetcherAuthorization from the OIDAuthState.
                 GTMAppAuthFetcherAuthorization *authorization =
                 [[GTMAppAuthFetcherAuthorization alloc] initWithAuthState:authState];
                 self.service.authorizer = authorization;
                 [self.secondVC dismissViewControllerAnimated:true completion:nil];
             } else {
                 NSLog(@"Authorization error: %@", [error localizedDescription]);
                 self.authorization = nil;
             }
         }];
    
    • Nhúng google drive sdk:
    • Khai báo property @property (nonatomic, strong) GTLRDriveService *service; self.service = [[GTLRDriveService alloc] init];

    • Sau khi request login bằng OIDAuthState xong ở response trả về ta sẽ có được:

         GTMAppAuthFetcherAuthorization *authorization = [[GTMAppAuthFetcherAuthorization alloc] initWithAuthState:authState]; // Lưu trữ thông tin login
          self.service.authorizer = authorization;
      
    • Sau đó các bạn có thể access file của google drive:

        // List up to 10 files in Drive
                    - (void)listFiles {
                                GTLRDriveQuery_FilesList *query = [GTLRDriveQuery_FilesList query];
                                query.fields = @"nextPageToken, files(id, name)";
                                query.pageSize = 10;
                                [self.service executeQuery:query delegate:self didFinishSelector:@selector(displayResultWithTicket:finishedWithObject:error:)];
                                    }                                                 
      

Chú ý:

Do google đã thay đổi chính sách nên nếu các bạn sử dụng thư viện oauth then GTMOAuth2 thì sẽ báo lỗi không có quyền truy cập do google không còn cho phép sử dụng UIWebView để login và đã chuyển sang dùng GTMAppAuth sử dung SafariController để login. Bạn có thể tham khảo code mẫu và thông tin ở https://developers.google.com/drive/v3/web/quickstart/ios https://github.com/google/gtm-oauth2 https://github.com/google/GTMAppAuth https://github.com/google/google-api-objectivec-client-for-rest/blob/master/Source/GeneratedServices/Drive/GTLRDriveQuery.h

Kết Luận:

Các bạn có thể download project mẫu tại đây: https://github.com/nguyenhaidang/TestGoogleDriveSDK.git