web-dev-qa-db-ja.com

iOSのリスナーを介してFirebaseに現在ログインしているユーザーを確認する

Firebase Authorizationを実装して、FacebookおよびGoogle経由でiOSアプリにログインします。私はSwiftをコーディングしています。アプリが起動したら、適切なViewControllerを提示するために、ユーザーが既にサインインしているかどうかを確認する必要があります(たとえば、サインインしているユーザーがいない場合は、Login View Controllerを提示し、それ以外の場合はHome View Controllerを提示します)。 Firebaseが提供する「簡単な」ソリューションを使用すると、

if FIRAuth.auth()?.currentUser != nil {
  // User is signed in.
  // ...
} else {
  // No user is signed in.
  // ...
}

したがって、現在のユーザーがnilでないかどうかを確認すると、Firebaseガイド( https://firebase.google.com/docs/auth/ios/manage-users )のアラートが何を意味するのか正確に発生します

「注:authオブジェクトが初期化を完了していないため、currentUserもnilになる可能性があります。リスナーを使用してユーザーのサインインステータスを追跡する場合、このケースを処理する必要はありません。」

だから私はガイドで提案されているようにリスナーを実装したいと思います:

handle = FIRAuth.auth()?.addStateDidChangeListener() { (auth, user) in
  // ...
}

リスナーは中間ステータスも処理するため、Authオブジェクトが作成されたときにトリガーされます。ポイントは本当に私がそれを正しく機能させることができないことです。誰かがこのリスナーを使用して、ユーザーがログインしているかどうかを確認するのを手伝ってくれる?

ありがとう

11
Freddie Mash

私はそれを次のように実装しました:

FIRAuth.auth()?.addStateDidChangeListener { auth, user in
  if let user = user {
    // User is signed in. Show home screen
  } else {
    // No User is signed in. Show user the login screen
  }
}

チェック後にUserオブジェクトが必要ない場合は、次のようにif let user = userをブールテストに置き換えることができます。

FIRAuth.auth()?.addStateDidChangeListener { auth, user in
  if user != nil {
    // User is signed in. Show home screen
  } else {
    // No User is signed in. Show user the login screen
  }
}

リスナーを配置する場所(コメントから):

ユーザーがサインインしているかどうかを確認するために使用したケースでは、特定のビューコントローラーのviewDidLoadの先頭に置くだけで十分でした。ただし、特定のビューコントローラーに入るたびに確認する必要がある場合は、viewDidAppearの先頭に配置することをお勧めします。しかし、ユーザーがビューに入った場合、ほとんどの場合、一度だけチェックする必要があると思います

12
ronatory

application:didFinishLaunchingWithOptionsStateDidChangeListenerを設定している場合は、リスナーが接続されたときに一度起動することがわかります(初期化時のnilである初期状態を設定するため) )、その後、初期化が完了すると(nilではない可能性があります)再び。これは意図的な動作ですが、早期に設定する場合は実際的ではありません。

リスナーを使用する代わりに、NotificationCenterを使用することもできます。これは、初期化が完了すると発生します。

NotificationCenter.default.addObserver(forName: NSNotification.Name.AuthStateDidChange, object: Auth.auth(), queue: nil) { _ in
    let user = Auth.auth().currentUser
}
3
Thomas Verbeek