#はじめに
storyboadを使わずに全てコードで実装しようとしたさい、FirebaseApp.configure()
の位置で躓いたのでメモ
##原因
FirebaseApp.configure()
を呼ぶところを遷移先のViewControllerのインスタンスを作った後に実行してしまっていた
##エラー内容
reason: 'The default FIRApp instance must be configured before the default
FIRAuthinstance can be initialized. One way to ensure that is to call `[FIRApp configure];`
(`FirebaseApp.configure()` in Swift) in the App Delegate's `application:didFinishLaunchingWithOptions:`
(`application(_:didFinishLaunchingWithOptions:)` in Swift).'
AppDelegate.swiftの内容
class AppDelegate: UIResponder, UIApplicationDelegate {
//アプリのインターフェースの背景
//windowはイベントを制御し、アプリを制御する基本となるたくさんのタスクを実行する
var window: UIWindow?
// 起動した直後に走る関数
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
//ストーリーボードを使わない場合は、このwindowを自分で作る必要がある。
self.window = UIWindow(frame: UIScreen.main.bounds)
//アプリが起動した時に一番最初に表示されたいViewControllerのインスタンスをつくる
let initialViewController = LoginViewController()
//アプリが立ち上がって一番最初に表示される画面をrootViewControllerという
//windowのプロパティであるrootViewControllerに、表示させたいUIViewControllerを設定する
self.window?.rootViewController = initialViewController
//現在のウィンドウを表示し、それを同じレベルまたはそれ以下の他のすべてのウィンドウの前に置く便利な関数。
self.window?.makeKeyAndVisible()
// Firebaseを使うのに必要(チュートリアルで入れるように言われる)
FirebaseApp.configure()
return true
}
LoginViewController.swiftの内容
viewDidLoad()
内でAuth.auth().currentUser
の関数を入れていたが、インスタンスが作られた時点で通り抜けないと思い込んでいた。
しかしAppDelegate
→let initialViewController = LoginViewController()
→LoginViewController内のviewDidLoad()
→Auth.auth().currentUser
→FirebaseApp.configure()
となっていて
Auth.auth().currentUser
の関数を呼ぶ前にFirebaseApp.configure()
を呼んでねというエラーがでていた
import UIKit
import SnapKit
import FirebaseAuth
class LoginViewController: UIViewController, UITextFieldDelegate {
override func viewDidLoad() {
super.viewDidLoad()
//FIRAuthは→Authにする
if Auth.auth().currentUser != nil {
self.signIn()
} else {
}
#解決策
AppDelegate.swift
FirebaseApp.configure()
を次の遷移先のViewControllerを呼ぶ前に呼んでおく
import UIKit
import Firebase
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
//アプリのインターフェースの背景
//windowはイベントを制御し、アプリを制御する基本となるたくさんのタスクを実行する
var window: UIWindow?
// 起動した直後に走る関数
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Firebaseを使うのに必要(チュートリアルで入れるように言われる)
FirebaseApp.configure()
//ストーリーボードを使わない場合は、このwindowを自分で作る必要がある。
self.window = UIWindow(frame: UIScreen.main.bounds)
//アプリが起動した時に一番最初に表示されたいViewControllerのインスタンスをつくる
let initialViewController = LoginViewController()
//アプリが立ち上がって一番最初に表示される画面をrootViewControllerという
//windowのプロパティであるrootViewControllerに、表示させたいUIViewControllerを設定する
self.window?.rootViewController = initialViewController
//現在のウィンドウを表示し、それを同じレベルまたはそれ以下の他のすべてのウィンドウの前に置く便利な関数。
self.window?.makeKeyAndVisible()
return true
}
}