iOSでFirebaseのGoogle認証登録を実装

f:id:surume_Reflection:20170520175010p:plain

記事

※注意※
17/05/20にFirebase4.0.0がリリースされていますが
過去バージョン指定をしないと動作しません



記事を書いている人間は、現段階でiOSアプリ開発の経験は2週間ほどで
基本Firebaseのガイド通りに実装しているだけなので 参考にはならないです
環境や注意点は書いてますが、メモレベルの記述なのであしからず..

環境:

開発環境-バージョン

xcode 8.3.2
cocoapod 1.2.1
Apple Swift 3.1
動作確認 (iOS 10.3)

SDK-バージョン

Firebase 3.17.0
GoogleSignIn 4.0.2

下準備:

xcodeのインストール (省略)
Firebaseにアカウント登録 (省略)
プロジェクトの作成
  1. iOSSingleViewApplicationを選択
    f:id:surume_Reflection:20170520160404p:plain

  2. アプリ名を入力後NEXTを押すと自動で生成されます。
    f:id:surume_Reflection:20170520160821p:plain

  3. Firebase側のAuthenticationのログイン方法から有効化
    f:id:surume_Reflection:20170520205539p:plain


1. ライブラリと初期設定:

cocoapodのインストー

$ gem install cocoapods
$ pod init # 管理ファイルを生成
$ vi Podfile # SDKの追記

※Podfileへの追記内容 f:id:surume_Reflection:20170520161028p:plain

  pod 'Firebase', '3.17.0'
  pod 'Firebase/Core'
  pod 'Firebase/Auth'
  pod 'GoogleSignIn', '4.0.2'

Firebaseにアプリを追加

  1. FirebaseのダッシュボードHOMEから概要のiOSを選択
  2. iOSバンドルIDに上記のBandleIdentfierの欄の内容をコピーペースト
    f:id:surume_Reflection:20170520162334p:plain ※BandleIdentfierはツリーの青いアプリ名ファイル選択してGeneralタブにあります。
  3. 設定ファイルのダウンロード設置
    f:id:surume_Reflection:20170520163419p:plain

アプリにREVERSED_CLIENT_IDを設定

  • 先ほど入れたGoogleService-info.plistREVERSED_CLIENT_IDをコピー f:id:surume_Reflection:20170520171658p:plain


  • プロジェクトのinfoURL Typeを追加し、URL Schemesにペースト f:id:surume_Reflection:20170520173140p:plain

2. 実装

インポートの記述

  1. AppDelegate.swiftViewController.swiftに下記を記述
import Firebase
import GoogleSignIn
  1. AppDelegate.swiftに初期化処理を記述 アプリ起動時のapplication:didFinishLaunchingWithOptions:内に記述します。
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch.
        FIRApp.configure()
        return true
    }

注意:
importでエラーが出ている場合はFramework Search Pathsがマッチしていない場合があります。
「CocoaPodsを使用しているプロジェクトでは、「.xcodeproj」のファイルから開くとビルドできません。」

コードの追記

AppDelegate.swift

import UIKit
import Firebase
import GoogleSignIn

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, GIDSignInDelegate, GIDSignInUIDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch.
        FIRApp.configure()
        
        GIDSignIn.sharedInstance().clientID = FIRApp.defaultApp()?.options.clientID
        GIDSignIn.sharedInstance().delegate = self
        
        return true
    }
    @available(iOS 9.0, *)
    func application(_ application: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any])
        -> Bool {
            return GIDSignIn.sharedInstance().handle(url,
                                                        sourceApplication:options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String,
                                                        annotation: [:])
    }
    func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
        return GIDSignIn.sharedInstance().handle(url,
                                                    sourceApplication: sourceApplication,
                                                    annotation: annotation)
    }
    func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error?) {
        if error != nil {
            return
        }
        
        guard let authentication = user.authentication else { return }
        let credential = FIRGoogleAuthProvider.credential(withIDToken: authentication.idToken,
                                                          accessToken: authentication.accessToken)
        FIRAuth.auth()?.signIn(with: credential) { (user, error) in
            if error != nil {
                return
            }
        }
    }
    func sign(_ signIn: GIDSignIn!, didDisconnectWith user:GIDGoogleUser!, withError error: Error!) {
        print("ログイン認証成功");
    }

    func applicationWillResignActive(_ application: UIApplication) {}
    func applicationDidEnterBackground(_ application: UIApplication) {}
    func applicationWillEnterForeground(_ application: UIApplication) {}
    func applicationDidBecomeActive(_ application: UIApplication) {}
    func applicationWillTerminate(_ application: UIApplication) {}
}

ViewController.swift

import UIKit
import Firebase
import GoogleSignIn

class ViewController: UIViewController, GIDSignInDelegate, GIDSignInUIDelegate {

    override func viewDidLoad() {
        super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib.
        
        GIDSignIn.sharedInstance().uiDelegate = self
        GIDSignIn.sharedInstance().signIn()
    }
    func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error?) {}
    func sign(_ signIn: GIDSignIn!, didDisconnectWith user:GIDGoogleUser!, withError error: Error!) {}

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}