次のコードを使用して、認証プロバイダーを検出し、適切にログアウトします
static func logOut() {
let auth = FIRAuth.auth()!
let provider = auth.currentUser?.providerID
switch provider! {
case "Facebook": FBSDKLoginManager().logOut()
case "Google": GIDSignIn.sharedInstance().signOut()
case "Twitter": Twitter.sharedInstance().sessionStore.logOutUserID(TWTRAPIClient.withCurrentUser().userID!)
default:
print("Unknown provider ID: \(provider!)")
return
}
try! auth.signOut()
}
ただし、プロバイダーは常に「Firebase」です。何が悪いのですか? 0_o一度Twitterにログインすると、そのコードで「Facebook」がスローされます。前もって感謝します
UPD:ええ、私は実際には認証プロバイダーをUserDefaults
に格納できますが、それはおそらくFirebaseのバグです。 Firebase SDK 3.5.2を使用しています
ユーザーは複数のプロバイダーを使用してFirebase Authenticationアカウントにログインできるため、トップレベルのプロバイダーIDは(通常)Firebase
になります。
しかし currentUser
にはproviderData
プロパティ があり、特定のプロバイダーに関する情報を提供します。 FIRAuth.auth()!.currentUser.providerData
をループすると FIRUserInfo.providerID
探しています。
同様の状況にあるUIDに関するこの質問も参照してください。 Firebaseは複数のIDを返します。どちらが一意ですか?
Swift 4ソリューション:
if let providerData = Auth.auth().currentUser?.providerData {
for userInfo in providerData {
switch userInfo.providerID {
case "facebook.com":
print("user is signed in with facebook")
case "google.com":
print("user is signed in with google")
default:
print("user is signed in with \(userInfo.providerID)")
}
}
}
それがどのように構成されているかを確認するために、JSON.stringify(currentUser.providerData)
を実行する必要がありました。
そして私はようやくAuth Provider
を次のように見つけました:
currentUser.providerData[0].providerId
乾杯、あなたのコードでGL :)
ログアウトするには、より簡単な方法があります。
let authUI = FUIAuth.defaultAuthUI()
do {
try authUI?.signOut()
} catch let err {
print(err);
}
一方、プロバイダーを検索し、ユーザーがそのプロバイダーを介してログインしているかどうかを確認する場合は、accessTokenを確認します。 accessTokenを取得するには、プロバイダーに提供した特定のプロバイダーインスタンスが必要です。
私はこれが最初にあなたのクラスであなたのプロバイダーをこのように宣言することによって最もよく達成されると思います:
lazy var facebookProvider = FUIFacebookAuth()
lazy var googleProvider = FUIGoogleAuth()
次に、プロバイダーを提供するとき:
let providers: [FUIAuthProvider] = [ facebookProvider, googleProvider ]
特定のプロバイダーデータが必要な場合:
if let providerData = Auth.auth().currentUser?.providerData {
for userInfo in providerData {
switch userInfo.providerID {
case "facebook.com":
if !facebookProvider.accessToken.isEmpty {
print("user is signed in with facebook")
}
case "google.com":
if !googleProvider.accessToken.isEmpty {
print("user is signed in with google")
}
default:
print("user is signed in with \(userInfo.providerID)")
}
}
}
それ以外の場合は、ユーザーが実際にログインしているかどうかに関係なく、各プロバイダーに関する情報を取得します。