[swift] Firebase + Googleアカウント認証の実装

目次

Firebase + Googleアカウント認証の実装

Firebase + Googleアカウント認証の実装するには以下の手順を実施する

Firebase

FirebaseのauthenticationでGoogle認証を有効にする
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2017-01-09-15-43-43

設定→GoogleService-info.plistをダウンロードする
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2017-01-09-15-46-04

pod

podファイルに下記ライブラリを追加しpodファイルのあるフォルダに移動してから

pod install

をコンソールで実行する

pod 'Firebase/Auth'
pod 'GoogleSignIn'

xcode

xcodeにGoogleService-info.plistをコピーする
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2017-01-09-15-49-48

GoogleService-info.plistを開き、REVERSED_CLIENT_IDの値をコピーする
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2017-01-09-15-51-21

xcodeのtarget->Info->URL Types->URL Schemesに先程のREVERSED_CLIENT_IDの値を貼り付けする
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2017-01-09-15-53-14

AppDelegate

AppDelegateに下記コードを実装

import Firebase

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        
        //Firebase //////////////
        FIRApp.configure() //for enable Firebase
}

    func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
        
        if GIDSignIn.sharedInstance().handleURL(url,
                                             sourceApplication: sourceApplication,
                                             annotation: annotation) {
            return true
        }

        return true
}

StoryBoard

Google認証を実施したいviewControllerにViewを配置し、GIDSignInButtonをクラスに設定する
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2017-01-09-16-01-46
見た目は変わらないが、Buildすると配置したViewがGoogleっぽいログインボタンで表示される

もしUIButtonなどカスタマイズされたボタンが必要な場合は、UIButtonを配置しておいてもよい

ViewController

認証を行いたいviewControllerに以下のコードを実装する

import UIKit
import Firebase

class ViewController: UIViewController,GIDSignInDelegate, GIDSignInUIDelegate{

    @IBOutlet weak var ggSignInButton: GIDSignInButton! //GIDSignInButtonクラスを継承したViewに関連付ける

    override func viewDidLoad() {
        super.viewDidLoad()
        
        //GoogleAccount /////
        GIDSignIn.sharedInstance().clientID = FIRApp.defaultApp()?.options.clientID
        GIDSignIn.sharedInstance().delegate = self
        GIDSignIn.sharedInstance().uiDelegate = self
    }

//UIButtonでSignInを実施したい場合はこちら
    @IBAction func ggSignInButtonClicked(sender: AnyObject) {
        GIDSignIn.sharedInstance().signIn()
    }
    
    //ログインが成功した場合
    func signIn(signIn: GIDSignIn!, didSignInForUser user: GIDGoogleUser!,
                withError error: NSError!) {
        print("Google Sing In didSignInForUser")
        if let error = error {
            print(error.localizedDescription)
            return
        }
        let authentication = user.authentication
        let credential = FIRGoogleAuthProvider.credentialWithIDToken(authentication.idToken,accessToken: authentication.accessToken)
        //ユーザ登録後の処理....
        
    }

    //ログインがキャンセル・失敗した場合
    func signIn(signIn: GIDSignIn!, didDisconnectWithUser user:GIDGoogleUser!,
                withError error: NSError!) {
        print("Google Sing In didDisconnectWithUser")
        // Perform any operations when the user disconnects from app here.
        // ...
    }
}

GIDSignInDelegate, GIDSignInUIDelegateの2つのDelegateを継承しておくこと、
ぱっと見同じDelegateに見えるがサインインのイベント用とUI用となっている

GIDSignInButtonが押されるか、もしくはGIDSignIn.sharedInstance().signIn()が呼ばれるとGoogleアカウント認証画面が表示される

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です