[iOS] Google Driveのファイル一覧を取得する

本記事では、Google Driveのファイル一覧を取得する実装を紹介します。
2020.05.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは。CX事業本部の平屋です。

本記事では、Google Driveのファイル一覧を取得する実装を紹介します。

検証環境

  • macOS Mojave 10.15.3
  • Xcode Version 11.3.1

Googleログインを追加する

Googleログインをアプリに追加します。追加方法については以下の記事で解説しています。

Google Drive API SDKを追加する

Google Drive APIのSDKをアプリに追加します。

ここでは、CocoaPodsを使用してインストールします。Podfileに以下のpodを追加し、pod installを実行します。

pod 'GoogleAPIClientForREST/Drive'

インストールが完了したら、*.xcworkspaceファイルを開きます。

ファイル一覧を取得する

import UIKit
import GoogleSignIn
import GoogleAPIClientForREST
import GTMSessionFetcher

class ViewController: UITableViewController {
    // (1) GTLRDriveServiceを作成する
    let googleDriveService = GTLRDriveService()

    // (2) GIDGoogleUserを準備しておく
    var googleUser: GIDGoogleUser?

    override func viewDidLoad() {
        super.viewDidLoad()

        getFiles()
    }

    func getFiles() {
        guard let user = googleUser else { return }

        // (3) authorizerを設定
        googleDriveService.authorizer = user.authentication.fetcherAuthorizer()

        // (4) queryを作成する
        let query = GTLRDriveQuery_FilesList.query()

        // (5) パラメータを設定する
        // (5-1) ルートディレクトリ直下のファイル/フォルダを取得対象にする (ルートディレクトリ以外を指定する場合は、rootではなく対象ディレクトリのIDを指定する)
        query.q = "'root' in parents"

        // (5-2) ドライブのファイルを取得対象にする (指定可能な値: drive, appDataFolder, photosが指定可能)
        query.spaces = "drive"

        // (5-3) 所有しているファイル(または他ユーザーから共有されたファイル)を取得対象にする (指定可能な値: user, domain, drive, allDrivesが指定可能)
        query.corpora = "user"

        // (5-4) ソート方法を指定する (指定可能な値: createdTime, folder, modifiedByMeTime, modifiedTime, name, name_natural, quotaBytesUsed, recency, sharedWithMeTime, starred, and 'viewedByMeTime)
        query.orderBy = "folder,name"

        // (6) クエリを実行する
        googleDriveService.executeQuery(query) { (_, result, error) in
            if let error = error {
                print(error.localizedDescription)
                return
            }

            // (7) ファイル一覧を使用する
            let folderList = result as! GTLRDrive_FileList
            guard let files = folderList.files else { return }
            for file in files {
                print("file.name: \(file.name ?? ""), file.mimeType: \(file.mimeType ?? ""), file.fileExtension: \(file.fileExtension ?? "")")
            }
        }
    }
}

(1) GTLRDriveServiceを作成する

GTLRDriveServiceを生成します。このクラスにクエリを与えることによってファイル一覧の取得などを行うことができます。

(2) GIDGoogleUserを取得しておく

GIDGoogleUserはGoogleログインの結果得られます。ログインしているユーザーの情報を保持します。GIDGoogleUserがもつ情報をGTLRDriveServiceに適用することで、そのユーザーに関するファイルに対して操作を行えるようになります。

(3) authorizerを設定する

GIDGoogleUserauthenticationfetcherAuthorizer()を使ってGTMFetcherAuthorizationProtocolに適合したオブジェクトを取得し、GTLRDriveServiceauthorizerにセットします。Authenticationヘッダ付きでリクエストを実行できるようになります。

(4) queryを作成する

ファイル一覧取得用のクエリGTLRDriveQuery_FilesListを作成します。Web API的には以下のAPIがこのクエリに対応します。

(5) パラメータを設定する

取得対象やソートに関するパラメータを設定します。設定できる内容は以下のページに記載されています。

(6) クエリを実行する

GTLRDriveServiceを使用して作成したクエリを実行します。

(7) ファイル一覧を使用する

取得成功すると、ファイルの一覧情報を保持するGTLRDrive_FileListを取得できます。各ファイルの情報を得るにはfilesプロパティを使用します。

さいごに

本記事では、Google Driveのファイル一覧を取得する実装を紹介しました。

次の記事ではGoogle Deiveの他のAPIで使用する例を扱う予定です。

参考資料