🕌

SwiftUIでFirebase Authentication(Google)を実装する

2021/02/11に公開

iPhoneアプリ開発初心者です。
Swift UIのサンプルコードが少なかったので、メモ程度に。

やっていることはこちらの方と一緒です。
https://zenn.dev/yorifuji/articles/swiftui-firebaseui

SwiftUIでFirebase Authentificationを実装したかったのですが、AppDelegate周りがわからなかったので自分なりに補足しました。GitHubにもあとで公開します。

2021年2月11日現在、Firebase AuthentificationのチュートリアルはGoogleのドキュメントにもありますが、SwiftUIに対応したコードはありません。FirebaseApp.configure()をYourSampleApp.swiftで呼ぶのがポイントです。

TL;DR;

  • CocoaPodsでFirebaseUIをインストール
  • FirebaseUISample.xcworkspaceを開く
  • GoogleService-Info.plistをダウンロード
  • URL SchemesにREVERSED_CLIENT_IDを追加
  • コードをガリガリ書く

CocoaPodsでFirebaseUIをインストール

cd your-project-directory
pod init
pod install

pod initするとカレントディレクトリにPodFileが生成される。# Pods for YourSampleの下に以下を追記する。

pod 'FirebaseUI/Auth'
pod 'FirebaseUI/Google'

pod FirebaseUIのみでも良いが、コンパイルの時間が長くなるので必要なもののみにした方が良い。pod installで構築完了。失敗したときはカレントディレクトリのYourSample.xcworkspace, Podfile.lock, Podsフォルダを削除すると元どおり。

https://firebase.google.com/docs/ios/setup?hl=ja

基本的にはGoogleのドキュメント通り。ここでは解説しないがCocoaPods自体の環境構築自体が一番大変。

FirebaseUISample.xcworkspaceを開く

Xcodeプロジェクトをすでに開いている場合、一度閉じる。その後、拡張子が「xcworkspace」のファイルを開く。CocoaPodsでインストールしたモジュールが使えるようになる。誤って拡張子が「xcodeproj」のものを開くとmodule not foundと表示される。

GoogleService-Info.plistをダウンロード

下記手順に従ってダウンロードする。

https://firebase.google.com/docs/ios/setup?hl=ja

URL SchemesにREVERSED_CLIENT_IDを追加

下記手順に従ってREVERSED_CLIENT_IDを追加する。

https://firebase.google.com/docs/auth/ios/firebaseui?hl=ja#google

コードをガリガリ書く

下記手順に従って、FirebaseUIView、FirebaseAuthStateObserver、ContentViewにコードをガリガリ書く。FirebaseUIView、FirebaseAuthStateObserverは新しくswiftファイルを足して書く。

https://zenn.dev/yorifuji/articles/swiftui-firebaseui

YourSampleApp.swiftにはAppDelegateクラスを宣言してFirebaseApp.configure()を呼ぶ。

import SwiftUI
import Firebase

@main
struct FirebaseUISampleApp: App {
    @UIApplicationDelegateAdaptor (AppDelegate.self) var appDelegate
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
    
    class AppDelegate: UIResponder, UIApplicationDelegate {
        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
            FirebaseApp.configure()
            
            return true
        }
    }
}

参考
https://fredriccliver.medium.com/how-init-firebase-when-youre-using-swiftui-as-the-new-swiftui-lifecycle-but-traditional-app-21d19c4b551f

https://qiita.com/matsuei/items/4f56c0f8d9a1b96cd9f0

Discussion