プログラムを書こう!

実務や自作アプリ開発で習得した役に立つソフトウェア技術情報を発信するブログ

SwiftのGoogleDrive APIで初期化処理を行う。

この記事は2018年07月22日に投稿しました。

f:id:paveway:20190914064630j:plain

目次

  1. はじめに
  2. 初期化処理
  3. おわりに

詳解 Swift 第4版

詳解 Swift 第4版

1. はじめに

こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
今回はGoogleDrive APIの初期化処理を行いたいと思います。

目次へ

2. 初期化処理

GoogleDrive APIの初期化処理ですが、以下のようになります。
認証処理にGTMAppAuthを使用するため、GTMAppAuthの初期化も一緒に行っています。

PWEditorでは、GTMAppAuth For iOS and macOSのドキュメントAuthorizingを参考にしながら実装しました。

import GoogleAPIClientForREST
import AppAuth
import GTMAppAuth

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    /// GoogleDriveサービスドライブ
    let googleDriveServiceDrive = GTLRDriveService()

    /// 認証
    var googleDriveAuthorization: GTMAppAuthFetcherAuthorization?

    /// 現在の認証フロー
    var googleDriveCurrentAuthorizationFlow: OIDAuthorizationFlowSession?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // GoogleDriveの初期化を行います。
        initGoogleDrive()
    }

    func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {
        // 現在のGoogleDriveの認証フローが有効な場合
        if let googleDriveCurrentAuthorizationFlow = googleDriveCurrentAuthorizationFlow {
            if googleDriveCurrentAuthorizationFlow.resumeAuthorizationFlow(with: url) {
                self.googleDriveCurrentAuthorizationFlow = nil
                return true
            }
        }
        return false
    }

    /**
     GoogleDriveの初期化を行います。
     */
    func initGoogleDrive() {
        // GoogleDriveのサインイン状態をキーチェーンからロードします。
        if let authorization = GTMAppAuthFetcherAuthorization(fromKeychainForName: "<キーチェーンのキー名>") {
            // 
            // GTM認証結果を設定します。
            self.setGtmAuthorization(authorization)
        }
    }

    /**
     GTM認証結果を設定します。

     - Parameter authorization: 認証結果
     */
    func setGtmAuthorization(_ authorization: GTMAppAuthFetcherAuthorization?) {
        if googleDriveAuthorization == authorization {
            return
        }
        googleDriveAuthorization = authorization
        // GoogleDriveのサインイン状態を保存します。
        saveGoogleDriveSignInState()
        googleDriveServiceDrive.authorizer = googleDriveAuthorization
    }
    
    /**
     GoogleDriveのサインイン状態をキーチェーンに保存します。
     */
    func saveGoogleDriveSignInState() {
        if let authorization = googleDriveAuthorization, authorization.canAuthorize() {
            // 認証済みの場合
            GTMAppAuthFetcherAuthorization.save(authorization, toKeychainForName: "<キーチェーンのキー名>")

        } else {
            // 未認証の場合
            GTMAppAuthFetcherAuthorization.removeFromKeychain(forName: "<キーチェーンのキー名>")
        }
    }
}

目次へ

3. おわりに

実装当時、認証処理のGTMAppAuthGoogleDrive APIが別物だということを知りませんでした。
GTMAppAuthGoogleDrive APIの一部だと思いながら実装したため混乱しました。

coconala.com

[改訂新版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus)

[改訂新版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus)

紹介している一部の記事のコードはGitlabで公開しています。
興味のある方は覗いてみてください。

目次へ


私が勤務しているニューラルでは、主に組み込み系ソフトの開発を行っております。
弊社製品のハイブリッドOS Bi-OSは高い技術力を評価されており、特に制御系や通信系を得意としています。
私自身はiOSモバイルアプリウィンドウズアプリを得意としております。
ソフトウェア開発に関して相談などございましたら、お気軽にご連絡ください。

また一緒に働きたい技術者の方も随時募集中です。
興味がありましたらご連絡ください。

EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688

目次へ