āĻāĻĒāύāĻŋ Firebase Authentication āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒā§ āϏāĻžāĻāύ āĻāύ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻ āĻŦāĻž āĻāĻāĻžāϧāĻŋāĻ āϏāĻžāĻāύ-āĻāύ āĻĒāĻĻā§āϧāϤāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§, āϝāĻžāϰ āĻŽāϧā§āϝ⧠āϰāϝāĻŧā§āĻā§ āĻāĻŽā§āϞ āĻ āĻŋāĻāĻžāύāĻž āĻāĻŦāĻ āĻĒāĻžāϏāĻāϝāĻŧāĻžāϰā§āĻĄ āϏāĻžāĻāύ-āĻāύ āĻāĻŦāĻ āĻĢā§āĻĄāĻžāϰā§āĻā§āĻĄ āĻĒāϰāĻŋāĻāϝāĻŧ āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰ⧠āϝā§āĻŽāύ Google āϏāĻžāĻāύ-āĻāύ āĻāĻŦāĻ Facebook āϞāĻāĻāύāĨ¤ āĻā§āĻāĻžāĻŦā§ āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒā§ āĻāĻŽā§āϞ āĻ āĻŋāĻāĻžāύāĻž āĻāĻŦāĻ āĻĒāĻžāϏāĻāϝāĻŧāĻžāϰā§āĻĄ āϏāĻžāĻāύ-āĻāύ āĻāϰāϤ⧠āĻšāϝāĻŧ āϤāĻž āĻĻā§āĻāĻŋāϝāĻŧā§ āĻāĻ āĻāĻŋāĻāĻā§āϰāĻŋāϝāĻŧāĻžāϞ āĻāĻĒāύāĻžāĻā§ Firebase Authentication āϏāĻžāĻĨā§ āĻļā§āϰ⧠āĻāϰā§āĨ¤
āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒāĻāĻŋāĻā§ Firebase-āĻ āϏāĻāϝā§āĻā§āϤ āĻāϰā§āύ
- Firebase SDK āĻāύāϏā§āĻāϞ āĻāϰā§āύ āĨ¤
- Firebase āĻāύāϏā§āϞ⧠, āĻāĻĒāύāĻžāϰ Firebase āĻĒā§āϰāĻāϞā§āĻĒā§ āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒ āϝā§āĻ āĻāϰā§āύāĨ¤
āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒā§ Firebase Authentication āϝā§āĻ āĻāϰā§āύ
āĻĢāĻžāϝāĻŧāĻžāϰāĻŦā§āϏ āύāĻŋāϰā§āĻāϰāϤāĻž āĻāύāϏā§āĻāϞ āĻāĻŦāĻ āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰāϤ⧠āϏā§āĻāĻĢāĻ āĻĒā§āϝāĻžāĻā§āĻ āĻŽā§āϝāĻžāύā§āĻāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύāĨ¤
- Xcode-āĻ, āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒ āĻĒā§āϰāĻāϞā§āĻĒ āĻā§āϞāĻžāϰ āϏāĻžāĻĨā§, āĻĢāĻžāĻāϞ > āĻĒā§āϝāĻžāĻā§āĻ āϝā§āĻ āĻāϰā§āύ -āĻ āύā§āĻāĻŋāĻā§āĻ āĻāϰā§āύāĨ¤
- āĻ āύā§āϰā§āϧ āĻāϰāĻž āĻšāϞā§, Firebase Apple āĻĒā§āϞā§āϝāĻžāĻāĻĢāϰā§āĻŽ SDK āϏāĻāĻā§āϰāĻšāϏā§āĻĨāϞ āϝā§āĻ āĻāϰā§āύ:
- Firebase Authentication āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āĻŦā§āĻā§ āύāĻŋāύāĨ¤
- āĻāĻĒāύāĻžāϰ āϞāĻā§āώā§āϝā§āϰ āĻŦāĻŋāϞā§āĻĄ āϏā§āĻāĻŋāĻāϏā§āϰ āĻ
āύā§āϝāĻžāύā§āϝ āϞāĻŋāĻā§āĻāĻžāϰ āĻĢā§āϞā§āϝāĻžāĻ āĻŦāĻŋāĻāĻžāĻā§
-ObjC
āĻĒāϤāĻžāĻāĻž āϝā§āĻ āĻāϰā§āύāĨ¤ - āĻļā§āώ āĻšāϝāĻŧā§ āĻā§āϞā§, Xcode āϏā§āĻŦāϝāĻŧāĻāĻā§āϰāĻŋāϝāĻŧāĻāĻžāĻŦā§ āĻĒāĻāĻā§āĻŽāĻŋāϤ⧠āĻāĻĒāύāĻžāϰ āύāĻŋāϰā§āĻāϰāϤāĻžāĻā§āϞāĻŋ āϏāĻŽāĻžāϧāĻžāύ āĻāĻŦāĻ āĻĄāĻžāĻāύāϞā§āĻĄ āĻāϰāĻž āĻļā§āϰ⧠āĻāϰāĻŦā§āĨ¤
https://github.com/firebase/firebase-ios-sdk.git
(āĻāĻā§āĻāĻŋāĻ) Firebase Local Emulator Suite āϏāĻžāĻĨā§ āĻĒā§āϰā§āĻā§āĻāĻžāĻāĻĒ āĻāĻŦāĻ āĻĒāϰā§āĻā§āώāĻž āĻāϰā§āύ
āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒ āĻā§āĻāĻžāĻŦā§ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻāϰ⧠āϏ⧠āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāĻĨāĻž āĻŦāϞāĻžāϰ āĻāĻā§, āĻāϏā§āύ Authentication āĻāĻžāϰā§āϝāĻāĻžāϰāĻŋāϤāĻž āĻĒā§āϰā§āĻā§āĻāĻžāĻāĻĒ āĻāĻŦāĻ āĻĒāϰā§āĻā§āώāĻž āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻĒāύāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ āĻāĻŽāύ āϏāϰāĻā§āĻāĻžāĻŽāĻā§āϞāĻŋāϰ āĻāĻāĻāĻŋ āϏā§āĻ āĻāĻĒāϏā§āĻĨāĻžāĻĒāύ āĻāϰāĻž āϝāĻžāĻ: Firebase Local Emulator Suite āĨ¤ āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻā§āĻļāϞ āĻāĻŦāĻ āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰā§āĻĻā§āϰ āĻŽāϧā§āϝ⧠āϏāĻŋāĻĻā§āϧāĻžāύā§āϤ āύāĻŋāĻā§āĻā§āύ, Authentication āĻāĻŦāĻ Firebase Security Rules āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻĒāĻžāĻŦāϞāĻŋāĻ āĻāĻŦāĻ āĻĒā§āϰāĻžāĻāĻā§āĻ āĻĄā§āĻāĻž āϏāĻš āĻŦāĻŋāĻāĻŋāύā§āύ āĻĄā§āĻāĻž āĻŽāĻĄā§āϞ āĻā§āώā§āĻāĻž āĻāϰ⧠āĻĻā§āĻā§āύ, āĻŦāĻž āϏāĻžāĻāύ-āĻāύ UI āĻĄāĻŋāĻāĻžāĻāύā§āϰ āĻĒā§āϰā§āĻā§āĻāĻžāĻāĻĒāĻŋāĻ, āϞāĻžāĻāĻ āĻĒāϰāĻŋāώā§āĻŦāĻžāĻā§āϞāĻŋ āϏā§āĻĨāĻžāĻĒāύ āύāĻž āĻāϰ⧠āϏā§āĻĨāĻžāύā§āϝāĻŧāĻāĻžāĻŦā§ āĻāĻžāĻ āĻāϰāϤ⧠āϏāĻā§āώāĻŽ āĻšāĻāϝāĻŧāĻž āĻāĻāĻāĻŋ āĻĻā§āϰā§āĻĻāĻžāύā§āϤ āϧāĻžāϰāĻŖāĻž āĻšāϤ⧠āĻĒāĻžāϰā§ā§ˇ
āĻāĻāĻāĻŋ Authentication āĻāĻŽā§āϞā§āĻāϰ āĻšāϞ Local Emulator Suite āĻ āĻāĻļ, āϝāĻž āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒāĻā§ āĻ āύā§āĻāϰāĻŖ āĻāϰāĻž āĻĄāĻžāĻāĻžāĻŦā§āϏ āϏāĻžāĻŽāĻā§āϰ⧠āĻāĻŦāĻ āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύā§āϰ āϏāĻžāĻĨā§ āĻāύā§āĻāĻžāϰāĻ ā§āϝāĻžāĻā§āĻ āĻāϰāϤ⧠āϏāĻā§āώāĻŽ āĻāϰā§, āϏā§āĻāϏāĻžāĻĨā§ āĻāĻā§āĻāĻŋāĻāĻāĻžāĻŦā§ āĻāĻĒāύāĻžāϰ āĻ āύā§āĻāϰāĻŖ āĻāϰāĻž āĻĒā§āϰāĻāϞā§āĻĒ āϏāĻāϏā§āĻĨāĻžāύāĻā§āϞāĻŋ (āĻĢāĻžāĻāĻļāύ, āĻ āύā§āϝāĻžāύā§āϝ āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻāĻŦāĻ āύāĻŋāϰāĻžāĻĒāϤā§āϤāĻž āύāĻŋāϝāĻŧāĻŽ)āĨ¤
Authentication āĻāĻŽā§āϞā§āĻāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻŽāĻžāϤā§āϰ āĻāϝāĻŧā§āĻāĻāĻŋ āϧāĻžāĻĒ āĻāĻĄāĻŧāĻŋāϤ:
- āĻāĻŽā§āϞā§āĻāϰā§āϰ āϏāĻžāĻĨā§ āϏāĻāϝā§āĻ āĻāϰāϤ⧠āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒā§āϰ āĻĒāϰā§āĻā§āώāĻž āĻāύāĻĢāĻŋāĻāĻžāϰ⧠āĻā§āĻĄā§āϰ āĻāĻāĻāĻŋ āϞāĻžāĻāύ āϝā§āĻ āĻāϰāĻž āĻšāĻā§āĻā§āĨ¤
- āĻāĻĒāύāĻžāϰ āϏā§āĻĨāĻžāύā§āϝāĻŧ āĻĒā§āϰāĻā§āĻā§āĻ āĻĄāĻŋāϰā§āĻā§āĻāϰāĻŋāϰ āϰā§āĻ āĻĨā§āĻā§,
firebase emulators:start
āĨ¤ - āĻāύā§āĻāĻžāϰā§āĻā§āĻāĻŋāĻ āĻĒā§āϰā§āĻā§āĻāĻžāĻāĻĒāĻŋāĻāϝāĻŧā§āϰ āĻāύā§āϝ Local Emulator Suite UI āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž, āĻ āĻĨāĻŦāĻž āĻ -āĻāύā§āĻāĻžāϰā§āĻā§āĻāĻŋāĻ āĻĒāϰā§āĻā§āώāĻžāϰ āĻāύā§āϝ Authentication āĻāĻŽā§āϞā§āĻāϰ REST API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāĨ¤
āĻāĻāĻāĻŋ āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ āύāĻŋāϰā§āĻĻā§āĻļāĻŋāĻāĻž Connect your app to the Authentication emulator-āĻ āĻāĻĒāϞāĻŦā§āϧāĨ¤ āĻāϰāĻ āϤāĻĨā§āϝā§āϰ āĻāύā§āϝ, Local Emulator Suite āĻā§āĻŽāĻŋāĻāĻž āĻĻā§āĻā§āύāĨ¤
āĻāĻāύ āĻāϞā§āύ āĻāĻŋāĻāĻžāĻŦā§ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻāϰāĻž āϝāĻžāϝāĻŧāĨ¤
Firebase SDK āĻāϰāĻŽā§āĻ āĻāϰā§āύ
āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒ āĻĒā§āϰāϤāĻŋāύāĻŋāϧāĻŋāϤā§, āĻĒā§āϰāĻĨāĻŽā§ Firebase SDK āĻāĻŽāĻĻāĻžāύāĻŋ āĻāϰā§āύ:
āϏā§āĻāĻĢāĻ
import FirebaseCore
āĻāĻĻā§āĻĻā§āĻļā§āϝ-C
@import FirebaseCore;
āϤāĻžāϰāĻĒāϰ, application:didFinishLaunchingWithOptions:
āĻĒāĻĻā§āϧāϤāĻŋāϤā§, FirebaseApp
āĻ
āĻŦāĻā§āĻā§āĻāĻāĻŋ āĻļā§āϰ⧠āĻāϰā§āύ:
āϏā§āĻāĻĢāĻ
// Use Firebase library to configure APIs
FirebaseApp.configure()
āĻāĻĻā§āĻĻā§āĻļā§āϝ-C
// Use Firebase library to configure APIs
[FIRApp configure];
āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻ āĻŦāϏā§āĻĨāĻžāϰ āĻāύā§āϝ āĻļā§āύā§āύ
āϏāĻžāĻāύ-āĻāύ āĻāϰāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āϏāĻŽā§āĻĒāϰā§āĻā§ āϤāĻĨā§āϝā§āϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻāĻŽāύ āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻ
ā§āϝāĻžāĻĒā§āϰ āĻāĻŋāĻāϝāĻŧā§āϰ āĻāύā§āϝ, FIRAuth
āĻ
āĻŦāĻā§āĻā§āĻā§ āĻāĻāĻāύ āĻļā§āϰā§āϤāĻž āϏāĻāϝā§āĻā§āϤ āĻāϰā§āύāĨ¤ āϝāĻāύāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āϏāĻžāĻāύ-āĻāύ āĻ
āĻŦāϏā§āĻĨāĻž āĻĒāϰāĻŋāĻŦāϰā§āϤāĻŋāϤ āĻšāϝāĻŧ āϤāĻāύ āĻāĻ āĻļā§āϰā§āϤāĻžāĻā§ āĻāϞ āĻāϰāĻž āĻšāϝāĻŧāĨ¤
āĻāĻŋāĻ āĻāύā§āĻā§āϰā§āϞāĻžāϰā§āϰ viewWillAppear
āĻĒāĻĻā§āϧāϤāĻŋāϤ⧠āĻļā§āϰā§āϤāĻžāĻā§ āϏāĻāϝā§āĻā§āϤ āĻāϰā§āύ:
āϏā§āĻāĻĢāĻ
handle = Auth.auth().addStateDidChangeListener { auth, user in
// ...
}
āĻāĻĻā§āĻĻā§āĻļā§āϝ-C
self.handle = [[FIRAuth auth]
addAuthStateDidChangeListener:^(FIRAuth *_Nonnull auth, FIRUser *_Nullable user) {
// ...
}];
āĻāĻŦāĻ āĻāĻŋāĻ āĻāύā§āĻā§āϰā§āϞāĻžāϰā§āϰ viewWillDisappear
āĻĒāĻĻā§āϧāϤāĻŋāϤ⧠āĻļā§āϰā§āϤāĻžāĻā§ āĻŦāĻŋāĻā§āĻāĻŋāύā§āύ āĻāϰā§āύ:
āϏā§āĻāĻĢāĻ
Auth.auth().removeStateDidChangeListener(handle!)
āĻāĻĻā§āĻĻā§āĻļā§āϝ-C
[[FIRAuth auth] removeAuthStateDidChangeListener:_handle];
āύāϤā§āύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āϏāĻžāĻāύ āĻāĻĒ āĻāϰā§āύ
āĻāĻāĻāĻŋ āĻĢāϰā§āĻŽ āϤā§āϰāĻŋ āĻāϰā§āύ āϝāĻž āύāϤā§āύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āϤāĻžāĻĻā§āϰ āĻāĻŽā§āϞ āĻ āĻŋāĻāĻžāύāĻž āĻāĻŦāĻ āĻāĻāĻāĻŋ āĻĒāĻžāϏāĻāϝāĻŧāĻžāϰā§āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻĒāύāĻžāϰ āĻ
ā§āϝāĻžāĻĒā§ āύāĻŋāĻŦāύā§āϧāύ āĻāϰāϤ⧠āĻĻā§āϝāĻŧ⧎ āϝāĻāύ āĻāĻāĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻĢāϰā§āĻŽāĻāĻŋ āĻĒā§āϰāĻŖ āĻāϰā§āύ, āϤāĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻĻā§āĻāϝāĻŧāĻž āĻāĻŽā§āϞ āĻ āĻŋāĻāĻžāύāĻž āĻāĻŦāĻ āĻĒāĻžāϏāĻāϝāĻŧāĻžāϰā§āĻĄ āϝāĻžāĻāĻžāĻ āĻāϰā§āύ, āϤāĻžāϰāĻĒāϰ createUser
āĻĒāĻĻā§āϧāϤāĻŋāϤ⧠āϤāĻžāĻĻā§āϰ āĻĒāĻžāϏ āĻāϰā§āύ:
āϏā§āĻāĻĢāĻ
Auth.auth().createUser(withEmail: email, password: password) { authResult, error in
// ...
}
āĻāĻĻā§āĻĻā§āĻļā§āϝ-C
[[FIRAuth auth] createUserWithEmail:email
password:password
completion:^(FIRAuthDataResult * _Nullable authResult,
NSError * _Nullable error) {
// ...
}];
āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āϏāĻžāĻāύ āĻāύ āĻāϰā§āύ
āĻāĻāĻāĻŋ āĻĢāϰā§āĻŽ āϤā§āϰāĻŋ āĻāϰā§āύ āϝāĻž āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āϤāĻžāĻĻā§āϰ āĻāĻŽā§āϞ āĻ āĻŋāĻāĻžāύāĻž āĻāĻŦāĻ āĻĒāĻžāϏāĻāϝāĻŧāĻžāϰā§āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϏāĻžāĻāύ āĻāύ āĻāϰāϤ⧠āĻĻā§āϝāĻŧ⧎ āϝāĻāύ āĻāĻāĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻĢāϰā§āĻŽāĻāĻŋ āĻĒā§āϰāĻŖ āĻāϰā§āύ, āϤāĻāύ signIn
āĻĒāĻĻā§āϧāϤāĻŋāϤ⧠āĻāϞ āĻāϰā§āύ:
āϏā§āĻāĻĢāĻ
Auth.auth().signIn(withEmail: email, password: password) { [weak self] authResult, error in
guard let strongSelf = self else { return }
// ...
}
āĻāĻĻā§āĻĻā§āĻļā§āϝ-C
[[FIRAuth auth] signInWithEmail:self->_emailField.text
password:self->_passwordField.text
completion:^(FIRAuthDataResult * _Nullable authResult,
NSError * _Nullable error) {
// ...
}];
āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āϤāĻĨā§āϝ āĻĒāĻžāύ
āĻāĻāĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āϏāĻĢāϞāĻāĻžāĻŦā§ āϏāĻžāĻāύ āĻāύ āĻāϰāĻžāϰ āĻĒāϰā§, āĻāĻĒāύāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āϏāĻŽā§āĻĒāϰā§āĻā§ āϤāĻĨā§āϝ āĻĒā§āϤ⧠āĻĒāĻžāϰā§āύāĨ¤ āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻāĻĒāύāĻžāϰ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻ āĻŦāϏā§āĻĨāĻžāϝāĻŧ āĻļā§āϰā§āϤāĻž :
āϏā§āĻāĻĢāĻ
if let user = user {
// The user's ID, unique to the Firebase project.
// Do NOT use this value to authenticate with your backend server,
// if you have one. Use getTokenWithCompletion:completion: instead.
let uid = user.uid
let email = user.email
let photoURL = user.photoURL
var multiFactorString = "MultiFactor: "
for info in user.multiFactor.enrolledFactors {
multiFactorString += info.displayName ?? "[DispayName]"
multiFactorString += " "
}
// ...
}
āĻāĻĻā§āĻĻā§āĻļā§āϝ-C
if (user) {
// The user's ID, unique to the Firebase project.
// Do NOT use this value to authenticate with your backend server,
// if you have one. Use getTokenWithCompletion:completion: instead.
NSString *email = user.email;
NSString *uid = user.uid;
NSMutableString *multiFactorString = [NSMutableString stringWithFormat:@"MultiFactor: "];
for (FIRMultiFactorInfo *info in user.multiFactor.enrolledFactors) {
[multiFactorString appendString:info.displayName];
[multiFactorString appendString:@" "];
}
NSURL *photoURL = user.photoURL;
// ...
}
āĻĒāϰāĻŦāϰā§āϤ⧠āĻĒāĻĻāĻā§āώā§āĻĒ
āĻ āύā§āϝāĻžāύā§āϝ āĻĒāϰāĻŋāĻāϝāĻŧ āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰ⧠āĻāĻŦāĻ āĻŦā§āύāĻžāĻŽā§ āĻ āϤāĻŋāĻĨāĻŋ āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻāĻā§āϞāĻŋāϰ āĻāύā§āϝ āĻā§āĻāĻžāĻŦā§ āϏāĻŽāϰā§āĻĨāύ āϝā§āĻ āĻāϰāĻŦā§āύ āϤāĻž āĻāĻžāύā§āύ:
- Google āϏāĻžāĻāύ-āĻāύ
- āĻĢā§āϏāĻŦā§āĻ āϞāĻāĻāύ
- āĻā§āĻāĻāĻžāϰ āϞāĻāĻāύ
- GitHub āϞāĻāĻāύ āĻāϰā§āύ
- āĻŦā§āύāĻžāĻŽā§ āϏāĻžāĻāύ āĻāύ