スポンサーリンク

【Swift】GoogleDriveAPIでファイル一覧を取得する方法ご紹介。

Swift
スポンサーリンク

今回の記事はSwiftでiOSアプリからGoogleDriveAPIでdrive内のファイル一覧を取得する方法をご紹介する記事です。初心者にも分かりやすいように記載しますので、是非参考にして見て下さい。

スポンサーリンク

SwiftでGoogleDriveAPIを使用する準備

作業は下記になります。

  • GoogleDeveloperConsoleにアカウント作成
  • APIサービスの作成
  • OAuth同意画面の設定
  • 認証情報の設定
  • APIの有効化

順番に進みていきます。

GoogleDeveloperConsoleにアカウント作成

まずはGoogleDeveloperConsoleに登録を行い、APIサービスを有効にします。下記サイトから登録を行います。費用は無料枠の範囲があり、まず超えることはないので無料でできます。無料枠の上限はAPI利用10000とかだったのでこれを超えるようでしたら一度費用は確認しておいた方が良いです。

https://console.developers.google.com/

登録完了したとします。

API作成

新しいプロジェクトを作成して下さい。

私はすでにAPIを作成してしまっていたので表示がないですが、この辺りに「新しいプロジェクト」というボタンが表示されております。

ここを押してプロジェクトを作成します。

プロジェクト名はなんでもOKです。今回は「test」とし、場所は組織なしのままでOKです。

作成をクリックするとプロジェクトが作成され、ダッシュボードに遷移し、プロジェクトの情報を一覧で見ることができます。

作成したプロジェクト名が「Google Cloud Platform」の横に表示されていると思います。

次に上図のGoogle Cloud Platformの左にあるハンバーガーメニューをクリックし、メニューの中から「APIとサービス」の中の「認証情報」と「OAuth同意画面」を設定します。

OAuth同意画面の設定

まずはOAuth同意画面を設定します。

アプリ登録を行なっていきます。

アプリ名は適当でOK、ユーザサポート名はGoogleAccountのメールアドレスにしました。おそらくなんでも良い気もします。

完了すれば「保存して次へ」をクリック。

スコープの設定画面に移動するのでスコープを設定します。

使う使わないは後で決めれば良いので基本的に全てのスコープに権限を付与すれば良いと思います。追加されれば元のページに登録されます。

スコープの設定を終えれば次の「テストユーザ」の設定に進みます。

「ADD USERS」ボタンでテストユーザのメールアドレスを設定します。

概要で全ての情報を確認したら保存することでアプリを設定できます。これで同意画面の設定は完了です。

認証情報の設定

次に「認証情報」を設定していきます。「認証情報」をクリックし下記画面を表示します。

まずは「+認証情報を作成」をクリックします。

認証方法は「APIキー」「OAuth 2.0 クライアントID」「サービス アカウント」からの3通りあります。今回は「OAuth 2.0 クライアントID」での認証です。

まずはアプリの種類を設定します。「iOS」を選択。

アプリケーションの種類を設定すると下記のように入力画面が出てきます。

名前はなんでもOKです。バンドルIDはiOSアプリ固有のIDです。プロジェクトファイルに記載があるバンドルIDを設定します。

作成が完了すればダイアログが表示されますので「plistをダウンロード」をクリックしローカルにplistをダウンロードします。

APIの設定は完了です。

GoogleDriveAPIを有効にするのは忘れずにして下さい。ホームから「GoogleDriveAPI」を選択し、有効化されている場合は下記のような表記になっています。

APIを有効化

最後にAPIを有効化します。

最後にメニューの「APIとサービス」の「ライブラリ」からGoogleDriveAPIを探して有効化します。

有効化されている場合は下記のようになっています。

長かったですが、これでAPI側の設定は完了です。次に実際にファイル一覧を取得するコードをご紹介していきます。

SwiftでGoogleDirveAPIを使用する環境構築

Xcodeのプロジェクトを作成し、ファイルに実装をしていきます。

まずはSwiftでGoogleDriveAPIを使用するためのライブラリをpodでインストールしていきます。

ライブラリインストール

ちなみにpodでライブラリをインストールする方法に関しては別記事で記載しているのでそちらを参考にして下さい。

cocoaPodでXcodeプロジェクトにライブラリをインストールする方法。

ポッドファイルは下記のように編集して下さい。

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'アプリ名' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for アプリ名
  pod 'GoogleAPIClientForREST/Drive'#追加
  pod 'GoogleSignIn', '~>5.0'    #追加

  target 'アプリ名Test' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'アプリ名Test UI' do
    # Pods for testing
  end

end

次にプロジェクトの設定に進みます。

XcodeプロジェクトでGoogleDriveAPIを利用する設定

ローカルに保存したplistの中の「REVERSED_CLIENT_ID」のURLをコピーします。

info.plistの「URL Types」にURLにこの「REVERSED_CLIENT_ID」を設定します。

「URL Schemes」に設定を行います。

これで設定は完了です。実際にコードを実装していきます。

SwiftでGoogleDirveAPIを使用してファイル一覧を取得

編集するファイルは「Appdelegate.swift」「ViewController.Swift」の2点です。順番に説明していきます。

「Appdelegate.swift」を編集

  • ローカルに保存したplistの中の「CLIENT_ID」の値を下記に追加
  • 関数の追加
import UIKit
import GoogleSignIn

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    // 元々ある関数
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        // 追加(クライアントID)
        GIDSignIn.sharedInstance().clientID = "〇〇.apps.googleusercontent.com"
        return true
    }
    
    // 追加関数
    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
            // GIDSignInのhandle()を呼び、返り値がtrueであればtrueを返す
        if GIDSignIn.sharedInstance()!.handle(url) {
            return true
        }
        return false
    }
    // ...省略
}

「ViewController.Swift」を編集

次にViewControllerに実装を追加していきます。

import UIKit
import GoogleSignIn
import GoogleAPIClientForREST
import GTMSessionFetcher

class ViewController: UIViewController {
    // Google認証系
    let googleDriveService = GTLRDriveService()
    var googleUser: GIDGoogleUser?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // デリゲートを設定
        GIDSignIn.sharedInstance()?.delegate = self
        // ログイン画面の表示元を設定
        GIDSignIn.sharedInstance()?.presentingViewController = self
        if let user = GIDSignIn.sharedInstance()?.currentUser {
            print("currentUser.profile.email: \(user.profile!.email!)")
        } else {
            // 次回起動時にはこちらのログが出力される
            print("currentUser is nil")
        }
    }

    // GoogleriveLoginボタンアクション
    @IBAction func GoogleLogin(_ sender: Any) {
        // スコープの追加
        GIDSignIn.sharedInstance().scopes.append("https://www.googleapis.com/auth/drive")
        GIDSignIn.sharedInstance().scopes.append("https://www.googleapis.com/auth/drive.file")
        GIDSignIn.sharedInstance().scopes.append("https://www.googleapis.com/auth/drive.appdata")
        GIDSignIn.sharedInstance().scopes.append("https://www.googleapis.com/auth/drive.scripts")
        GIDSignIn.sharedInstance().scopes.append("https://www.googleapis.com/auth/drive.metadata")
        // ログインを実行
        if GIDSignIn.sharedInstance()!.hasPreviousSignIn() {
            // 以前のログイン情報が残っていたら復元する
            GIDSignIn.sharedInstance()!.restorePreviousSignIn()
        } else {
            // 通常のログインを実行
            GIDSignIn.sharedInstance()?.signIn()
        }
        return
    }
        
    // ファイル取得ボタンアクション
    @IBAction func GetFileList(_ sender: Any) {
        // ログインユーザ
        guard let user = googleUser else { return }
        // 認証設定
        googleDriveService.authorizer = user.authentication.fetcherAuthorizer()
        // ファイル一覧取得クエリ
        let query = GTLRDriveQuery_FilesList.query()
        // クエリにはメソッドを追加可能(今回は何も設定していないので自身のDrive内の全ファイルを取得)
        
        // クエリ実行
        googleDriveService.executeQuery(query) { (_, result, error) in
            // エラーの場合
            if let error = error { 
                print(error); 
                return 
            }
            // フォルダ一覧
            let folderList = result as! GTLRDrive_FileList
            // ファイル一覧
            guard let files = folderList.files else { return }
            // 取得したファイル一覧をfor文で回す
            for file in files {
                print("file.name: \(file.name ?? ""), file.mimeType: \(file.mimeType ?? ""), file.fileExtension: \(file.fileExtension ?? "")")
            }
        }       
    }
}

// GIDSignInDelegate部分
extension ViewController: GIDSignInDelegate {
    func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {
        if error == nil {
            // ログイン成功した場合
            print("signIned user email: \(user!.profile!.email!)")
            let service = GTLRDriveService()
            service.authorizer = user.authentication.fetcherAuthorizer()
            googleUser = user
        } else {
            // ログイン失敗した場合
            print("error: \(error!.localizedDescription)")
        }
    }
}

上記コードで基本的にボタンなどに関数を紐づければ関数は動くと思います。順番に解説していきます。

    // Google認証系
    let googleDriveService = GTLRDriveService()
    var googleUser: GIDGoogleUser?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // デリゲートを設定
        GIDSignIn.sharedInstance()?.delegate = self
        // ログイン画面の表示元を設定
        GIDSignIn.sharedInstance()?.presentingViewController = self
        if let user = GIDSignIn.sharedInstance()?.currentUser {
            print("currentUser.profile.email: \(user.profile!.email!)")
        } else {
            // 次回起動時にはこちらのログが出力される
            print("currentUser is nil")
        }
    }

上記の「viewdidload」にdelegate等の設定を行います。if文以下に関しては次回ログイン時にログイン保持されている場合はそのログインを使用するような設定です。

初期画面ではログインされていないのでログインをする必要があります。下記がログイン実行のコードです。

    // GoogleriveLoginボタンアクション
    @IBAction func GoogleLogin(_ sender: Any) {
        // スコープの追加
        GIDSignIn.sharedInstance().scopes.append("https://www.googleapis.com/auth/drive")
        GIDSignIn.sharedInstance().scopes.append("https://www.googleapis.com/auth/drive.file")
        GIDSignIn.sharedInstance().scopes.append("https://www.googleapis.com/auth/drive.appdata")
        GIDSignIn.sharedInstance().scopes.append("https://www.googleapis.com/auth/drive.scripts")
        GIDSignIn.sharedInstance().scopes.append("https://www.googleapis.com/auth/drive.metadata")
        // ログインを実行
        if GIDSignIn.sharedInstance()!.hasPreviousSignIn() {
            // 以前のログイン情報が残っていたら復元する
            GIDSignIn.sharedInstance()!.restorePreviousSignIn()
        } else {
            // 通常のログインを実行
            GIDSignIn.sharedInstance()?.signIn()
        }
        return
    }

よくある記事では下記の部分がなく認証エラーになります。エラー出ている方は原因等を解説した記事もあるので原因等気になる方はこちら参照ください。

// スコープの追加
GIDSignIn.sharedInstance().scopes.append("https://www.googleapis.com/auth/drive")
GIDSignIn.sharedInstance().scopes.append("https://www.googleapis.com/auth/drive.file")
GIDSignIn.sharedInstance().scopes.append("https://www.googleapis.com/auth/drive.appdata")
GIDSignIn.sharedInstance().scopes.append("https://www.googleapis.com/auth/drive.scripts")
GIDSignIn.sharedInstance().scopes.append("https://www.googleapis.com/auth/drive.metadata")        

このログインボタンが押される

拡張に記載したdelegateが走ります。

// GIDSignInDelegate部分
extension ViewController: GIDSignInDelegate {
    func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {
        if error == nil {
            // ログイン成功した場合
            print("signIned user email: \(user!.profile!.email!)")
            let service = GTLRDriveService()
            service.authorizer = user.authentication.fetcherAuthorizer()
            googleUser = user
        } else {
            // ログイン失敗した場合
            print("error: \(error!.localizedDescription)")
        }
    }
}

これでよく見るブラウザベースのGoogleログイン画面が出てくるのでログインすることで認証完了です。どのような権限を与えるかの設定を行い、アプリに戻ります。

ここでコンソールにログインメールアドレスが出力されれば認証成功してGoogleDriveにログインできている状況です。

最後にファイル一覧取得を行うコードは下記になります。

    // ファイル取得ボタンアクション
    @IBAction func GetFileList(_ sender: Any) {
        // ログインユーザ
        guard let user = googleUser else { return }
        // 認証設定
        googleDriveService.authorizer = user.authentication.fetcherAuthorizer()
        // ファイル一覧取得クエリ
        let query = GTLRDriveQuery_FilesList.query()
        // クエリにはメソッドを追加可能(今回は何も設定していないので自身のDrive内の全ファイルを取得)
        
        // クエリ実行
        googleDriveService.executeQuery(query) { (_, result, error) in
            // エラーの場合
            if let error = error { 
                print(error); 
                return 
            }
            // フォルダ一覧
            let folderList = result as! GTLRDrive_FileList
            // ファイル一覧
            guard let files = folderList.files else { return }
            // 取得したファイル一覧をfor文で回す
            for file in files {
                print("file.name: \(file.name ?? ""), file.mimeType: \(file.mimeType ?? ""), file.fileExtension: \(file.fileExtension ?? "")")
            }
        }       
    }

クエリを実行してファイル取得を行います。クエリの種類に関しては公式の方を見て種類を見ていきましょう。検索条件をつけたり並び順をつけたりとSQLのように操作をすることができるようです。

ファイル一覧を無事取得できたでしょうか?

今回の記事は以上です。他にもSwiftでGoogleDriveAPIを使用する関連記事を記載しています。

  • SwiftでGoogleDriveAPIを使用してファイルをアップロードする方法
  • SwiftでGoogleDriveAPIを使用して画像をアップロードする方法

興味あれば他にもサイト内見て行って下さい。

本記事を読んでいただき感謝です。サイトを訪れていただいた方はプログラミング勉強中かと思いますのでプログラミング勉強のコツを合わせてご紹介。

スポンサーリンク
スポンサーリンク
スポンサーリンク

ブログに関しては500円程度かかりますが、それ以外は無料です。知識の吸収と並行してアウトプットは非常に効率が良いです。テックアカデミーに関しては講座レベルが高いにも関わらず、無料体験や人気口座も大幅値下げがあるので、重点的に学びたいものを無料体験してみてください。

転職時にも、エンジニアからテックアカデミー・Paizaは認知度が高いので、未経験入社採用を行う際履歴書で目に留まります。特にPaizaのスキルレベルA・SなどはIT業界でも評価されます。

テックアカデミー・Paizaの無料登録ができる期間中にぜひご利用してみてください。私も活用経験ありです。

Swift
スポンサーリンク
スポンサーリンク

コメント

タイトルとURLをコピーしました