āĻāĻĒāύāĻŋ āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒā§ Google āϏāĻžāĻāύ-āĻāύ āϏāĻāĻšāϤ āĻāϰ⧠āĻāĻĒāύāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āϤāĻžāĻĻā§āϰ Google āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠Firebase-āĻāϰ āϏāĻžāĻĨā§ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻāϰāϤ⧠āĻĻāĻŋāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
āĻāĻĒāύāĻŋ āĻļā§āϰ⧠āĻāϰāĻžāϰ āĻāĻā§
āĻĢāĻžāϝāĻŧāĻžāϰāĻŦā§āϏ āύāĻŋāϰā§āĻāϰāϤāĻž āĻāύāϏā§āĻāϞ āĻāĻŦāĻ āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰāϤ⧠āϏā§āĻāĻĢāĻ āĻĒā§āϝāĻžāĻā§āĻ āĻŽā§āϝāĻžāύā§āĻāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύāĨ¤
- Xcode-āĻ, āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒ āĻĒā§āϰāĻāϞā§āĻĒ āĻā§āϞāĻžāϰ āϏāĻžāĻĨā§, āĻĢāĻžāĻāϞ > āĻĒā§āϝāĻžāĻā§āĻ āϝā§āĻ āĻāϰā§āύ -āĻ āύā§āĻāĻŋāĻā§āĻ āĻāϰā§āύāĨ¤
- āĻ āύā§āϰā§āϧ āĻāϰāĻž āĻšāϞā§, Firebase Apple āĻĒā§āϞā§āϝāĻžāĻāĻĢāϰā§āĻŽ SDK āϏāĻāĻā§āϰāĻšāϏā§āĻĨāϞ āϝā§āĻ āĻāϰā§āύ:
- Firebase Authentication āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āĻŦā§āĻā§ āύāĻŋāύāĨ¤
- āĻāĻĒāύāĻžāϰ āϞāĻā§āώā§āϝā§āϰ āĻŦāĻŋāϞā§āĻĄ āϏā§āĻāĻŋāĻāϏā§āϰ āĻ
āύā§āϝāĻžāύā§āϝ āϞāĻŋāĻā§āĻāĻžāϰ āĻĢā§āϞā§āϝāĻžāĻ āĻŦāĻŋāĻāĻžāĻā§
-ObjC
āĻĒāϤāĻžāĻāĻž āϝā§āĻ āĻāϰā§āύāĨ¤ - āĻļā§āώ āĻšāϝāĻŧā§ āĻā§āϞā§, Xcode āϏā§āĻŦāϝāĻŧāĻāĻā§āϰāĻŋāϝāĻŧāĻāĻžāĻŦā§ āĻĒāĻāĻā§āĻŽāĻŋāϤ⧠āĻāĻĒāύāĻžāϰ āύāĻŋāϰā§āĻāϰāϤāĻžāĻā§āϞāĻŋ āϏāĻŽāĻžāϧāĻžāύ āĻāĻŦāĻ āĻĄāĻžāĻāύāϞā§āĻĄ āĻāϰāĻž āĻļā§āϰ⧠āĻāϰāĻŦā§āĨ¤
https://github.com/firebase/firebase-ios-sdk.git
āĻāĻĒāύāĻžāϰ āĻĒā§āϰā§āĻā§āĻā§āĻā§ Google āϏāĻžāĻāύ-āĻāύ SDK āϝā§āĻ āĻāϰā§āύ
Xcode-āĻ, āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒ āĻĒā§āϰāĻāϞā§āĻĒ āĻā§āϞāĻžāϰ āϏāĻžāĻĨā§, āĻĢāĻžāĻāϞ > āĻĒā§āϝāĻžāĻā§āĻ āϝā§āĻ āĻāϰā§āύ -āĻ āύā§āĻāĻŋāĻā§āĻ āĻāϰā§āύāĨ¤
āĻ āύā§āϰā§āϧ āĻāϰāĻž āĻšāϞā§, Google āϏāĻžāĻāύ-āĻāύ SDK āϏāĻāĻā§āϰāĻšāϏā§āĻĨāϞ āϝā§āĻ āĻāϰā§āύ:
https://github.com/google/GoogleSignIn-iOS
āĻļā§āώ āĻšāϝāĻŧā§ āĻā§āϞā§, Xcode āϏā§āĻŦāϝāĻŧāĻāĻā§āϰāĻŋāϝāĻŧāĻāĻžāĻŦā§ āĻĒāĻāĻā§āĻŽāĻŋāϤ⧠āĻāĻĒāύāĻžāϰ āύāĻŋāϰā§āĻāϰāϤāĻžāĻā§āϞāĻŋ āϏāĻŽāĻžāϧāĻžāύ āĻāĻŦāĻ āĻĄāĻžāĻāύāϞā§āĻĄ āĻāϰāĻž āĻļā§āϰ⧠āĻāϰāĻŦā§āĨ¤
āĻāĻĒāύāĻžāϰ Firebase āĻĒā§āϰāĻāϞā§āĻĒā§āϰ āĻāύā§āϝ Google āϏāĻžāĻāύ-āĻāύ āϏāĻā§āώāĻŽ āĻāϰā§āύ⧎
āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ Google āϏāĻžāĻāύ-āĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϏāĻžāĻāύ āĻāύ āĻāϰāĻžāϰ āĻ āύā§āĻŽāϤāĻŋ āĻĻāĻŋāϤā§, āĻāĻĒāύāĻžāĻā§ āĻĒā§āϰāĻĨāĻŽā§ āĻāĻĒāύāĻžāϰ Firebase āĻĒā§āϰāĻāϞā§āĻĒā§āϰ āĻāύā§āϝ Google āϏāĻžāĻāύ-āĻāύ āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰā§āĻā§ āϏāĻā§āώāĻŽ āĻāϰāϤ⧠āĻšāĻŦā§:
- Firebase āĻāύāϏā§āϞ⧠, āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻŦāĻŋāĻāĻžāĻāĻāĻŋ āĻā§āϞā§āύāĨ¤
- āϏāĻžāĻāύ āĻāύ āĻĒāĻĻā§āϧāϤāĻŋ āĻā§āϝāĻžāĻŦā§, Google āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰ⧠āϏāĻā§āώāĻŽ āĻāϰā§āύ⧎
āϏāĻāϰāĻā§āώāĻŖ āĻāϰā§āύ āĻā§āϞāĻŋāĻ āĻāϰā§āύ.
āĻāĻĒāύāĻžāϰ āĻĒā§āϰāĻāϞā§āĻĒā§āϰ
GoogleService-Info.plist
āĻĢāĻžāĻāϞā§āϰ āĻāĻāĻāĻŋ āύāϤā§āύ āĻ āύā§āϞāĻŋāĻĒāĻŋ āĻĄāĻžāĻāύāϞā§āĻĄ āĻāϰā§āύ āĻāĻŦāĻ āĻāĻāĻŋ āĻāĻĒāύāĻžāϰ Xcode āĻĒā§āϰāĻāϞā§āĻĒā§ āĻ āύā§āϞāĻŋāĻĒāĻŋ āĻāϰā§āύāĨ¤ āύāϤā§āύā§āϰ āϏāĻžāĻĨā§ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āϝā§āĻā§āύ⧠āϏāĻāϏā§āĻāϰāĻŖ āĻāĻāĻžāϰāϰāĻžāĻāĻ āĻāϰā§āύāĨ¤ ( āĻāĻĒāύāĻžāϰ iOS āĻĒā§āϰāĻāϞā§āĻĒā§ Firebase āϝā§āĻ āĻāϰā§āύ āĻĻā§āĻā§āύāĨ¤)
āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧ āĻšā§āĻĄāĻžāϰ āĻĢāĻžāĻāϞ āĻāĻŽā§āĻĒā§āϰā§āĻ āĻāϰā§āύ
āĻĒā§āϰāĻĨāĻŽā§, āĻāĻĒāύāĻžāĻā§ āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒā§ Firebase SDK āĻāĻŦāĻ Google āϏāĻžāĻāύ-āĻāύ SDK āĻšā§āĻĄāĻžāϰ āĻĢāĻžāĻāϞāĻā§āϞāĻŋ āĻāĻŽāĻĻāĻžāύāĻŋ āĻāϰāϤ⧠āĻšāĻŦā§ā§ˇ
āϏā§āĻāĻĢāĻ
import FirebaseCore import FirebaseAuth import GoogleSignIn
āĻāĻĻā§āĻĻā§āĻļā§āϝ-C
@import FirebaseCore; @import GoogleSignIn;
Google āϏāĻžāĻāύ-āĻāύ āĻĒā§āϰāϝāĻŧā§āĻ āĻāϰā§āύ
āĻāĻ āĻĒāĻĻāĻā§āώā§āĻĒāĻā§āϞāĻŋ āĻ āύā§āϏāϰāĻŖ āĻāϰ⧠Google āϏāĻžāĻāύ-āĻāύ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ āĻāϰā§āύ⧎ iOS-āĻāϰ āϏāĻžāĻĨā§ Google āϏāĻžāĻāύ-āĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āĻŦāĻŋāώāϝāĻŧā§ āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ āĻāĻžāύāĻžāϰ āĻāύā§āϝ Google āϏāĻžāĻāύ-āĻāύ āĻĄā§āĻā§āϞāĻĒāĻžāϰ āĻĄāĻā§āĻŽā§āύā§āĻā§āĻļāύ āĻĻā§āĻā§āύāĨ¤
- āĻāĻĒāύāĻžāϰ Xcode āĻĒā§āϰāĻāϞā§āĻĒā§ āĻāĻžāϏā§āĻāĻŽ URL āϏā§āĻāĻŋāĻŽ āϝā§āĻ āĻāϰā§āύ:
- āĻāĻĒāύāĻžāϰ āĻĒā§āϰāĻāϞā§āĻĒ āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύ āĻā§āϞā§āύ: āĻŦāĻžāĻŽ āĻā§āϰāĻŋ āĻāĻŋāĻāϤ⧠āĻĒā§āϰāĻāϞā§āĻĒā§āϰ āύāĻžāĻŽ āĻā§āϞāĻŋāĻ āĻāϰā§āύāĨ¤ āϞāĻā§āώā§āϝ āĻŦāĻŋāĻāĻžāĻ āĻĨā§āĻā§ āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒāĻāĻŋ āύāĻŋāϰā§āĻŦāĻžāĻāύ āĻāϰā§āύ, āϤāĻžāϰāĻĒāϰ āϤāĻĨā§āϝ āĻā§āϝāĻžāĻŦāĻāĻŋ āύāĻŋāϰā§āĻŦāĻžāĻāύ āĻāϰā§āύ āĻāĻŦāĻ URL āĻĒā§āϰāĻāĻžāϰ āĻŦāĻŋāĻāĻžāĻāĻāĻŋ āĻĒā§āϰāϏāĻžāϰāĻŋāϤ āĻāϰā§āύ⧎
- + āĻŦā§āϤāĻžāĻŽā§ āĻā§āϞāĻŋāĻ āĻāϰā§āύ āĻāĻŦāĻ āĻāĻĒāύāĻžāϰ āĻŦāĻŋāĻĒāϰā§āϤ āĻā§āϞāĻžāϝāĻŧā§āύā§āĻ āĻāĻāĻĄāĻŋāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ URL āϏā§āĻāĻŋāĻŽ āϝā§āĻ āĻāϰā§āύāĨ¤ āĻāĻ āĻŽāĻžāύāĻāĻŋ āĻā§āĻāĻā§ āĻĒā§āϤā§,
āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύ āĻĢāĻžāĻāϞāĻāĻŋ āĻā§āϞā§āύ āĻāĻŦāĻGoogleService-Info.plist REVERSED_CLIENT_ID
āĻā§āĻāĻŋ āϏāύā§āϧāĻžāύ āĻāϰā§āύ⧎ āϏā§āĻ āĻā§āĻāĻŋāϰ āĻŽāĻžāύ āĻāĻĒāĻŋ āĻāϰā§āύ āĻāĻŦāĻ āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύ āĻĒā§āώā§āĻ āĻžāϰ URL āϏā§āĻāĻŋāĻŽ āĻŦāĻā§āϏ⧠āĻĒā§āϏā§āĻ āĻāϰā§āύāĨ¤ āĻ āύā§āϝāĻžāύā§āϝ āĻā§āώā§āϤā§āϰāĻā§āϞāĻŋāĻā§ āϏā§āĻĒāϰā§āĻļ āύāĻž āĻāϰ⧠āĻā§āĻĄāĻŧā§ āĻĻāĻŋāύāĨ¤āϏāĻŽā§āĻĒāύā§āύ āĻšāϞā§, āĻāĻĒāύāĻžāϰ āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύāĻāĻŋ āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤāĻā§āϞāĻŋāϰ āĻŽāϤ⧠āĻĻā§āĻāϤ⧠āĻšāĻŦā§ (āĻāĻŋāύā§āϤ⧠āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ-āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻŽāĻžāύāĻā§āϞāĻŋāϰ āϏāĻžāĻĨā§):
- āĻāĻĒāύāĻžāϰ āĻ
ā§āϝāĻžāĻĒ āĻĒā§āϰāϤāĻŋāύāĻŋāϧāĻŋāϰ
application:didFinishLaunchingWithOptions:
āĻĒāĻĻā§āϧāϤāĻŋāϤā§,FirebaseApp
āĻ āĻŦāĻā§āĻā§āĻ āĻāύāĻĢāĻŋāĻāĻžāϰ āĻāϰā§āύāĨ¤āϏā§āĻāĻĢāĻ
FirebaseApp.configure()
āĻāĻĻā§āĻĻā§āĻļā§āϝ-C
// Use Firebase library to configure APIs [FIRApp configure];
- āĻāĻĒāύāĻžāϰ āĻ
ā§āϝāĻžāĻĒ āĻĒā§āϰāϤāĻŋāύāĻŋāϧāĻŋāϰ
application:openURL:options:
āĻĒāĻĻā§āϧāϤāĻŋ āĻĒā§āϰāϝāĻŧā§āĻ āĻāϰā§āύāĨ¤ āĻĒāĻĻā§āϧāϤāĻŋāĻāĻŋāĻā§GIDSignIn
āĻāĻĻāĻžāĻšāϰāĻŖā§āϰhandleURL
āĻĒāĻĻā§āϧāϤāĻŋāϤ⧠āĻāϞ āĻāϰāĻž āĻāĻāĻŋāϤ, āϝāĻž āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāϰ āĻļā§āώ⧠āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύāĻāĻŋ āϝ⧠URLāĻāĻŋ āĻĒāĻžāĻŦā§ āϤāĻž āϏāĻ āĻŋāĻāĻāĻžāĻŦā§ āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰāĻŦā§āĨ¤āϏā§āĻāĻĢāĻ
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool { return GIDSignIn.sharedInstance.handle(url) }
āĻāĻĻā§āĻĻā§āĻļā§āϝ-C
- (BOOL)application:(nonnull UIApplication *)application openURL:(nonnull NSURL *)url options:(nonnull NSDictionary<NSString *, id> *)options { return [[GIDSignIn sharedInstance] handleURL:url]; }
- āĻāĻĒāύāĻžāϰ āĻ
ā§āϝāĻžāĻĒā§āϰ āĻāύā§āϝ āĻĒā§āϰā§āĻā§āύā§āĻāĻŋāĻ āĻāĻŋāĻ āĻāύā§āĻā§āϰā§āϞāĻžāϰ āĻāĻŦāĻ āĻā§āϞāĻžāϝāĻŧā§āύā§āĻ āĻāĻāĻĄāĻŋ Google āϏāĻžāĻāύ-āĻāύ āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰā§āϰ
signIn
āĻĒāĻĻā§āϧāϤāĻŋāϤ⧠āĻĒāĻžāϏ āĻāϰā§āύ āĻāĻŦāĻ āĻāϰ āĻĢāϞ⧠Google āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻā§āĻā§āύ āĻĨā§āĻā§ āĻāĻāĻāĻŋ Firebase āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻļāĻāϏāĻžāĻĒāϤā§āϰ āϤā§āϰāĻŋ āĻāϰā§āύ:āϏā§āĻāĻĢāĻ
guard let clientID = FirebaseApp.app()?.options.clientID else { return } // Create Google Sign In configuration object. let config = GIDConfiguration(clientID: clientID) GIDSignIn.sharedInstance.configuration = config // Start the sign in flow! GIDSignIn.sharedInstance.signIn(withPresenting: self) { [unowned self] result, error in guard error == nil else { // ... } guard let user = result?.user, let idToken = user.idToken?.tokenString else { // ... } let credential = GoogleAuthProvider.credential(withIDToken: idToken, accessToken: user.accessToken.tokenString) // ... }
āĻāĻĻā§āĻĻā§āĻļā§āϝ-C
GIDConfiguration *config = [[GIDConfiguration alloc] initWithClientID:[FIRApp defaultApp].options.clientID]; [GIDSignIn.sharedInstance setConfiguration:config]; __weak __auto_type weakSelf = self; [GIDSignIn.sharedInstance signInWithPresentingViewController:self completion:^(GIDSignInResult * _Nullable result, NSError * _Nullable error) { __auto_type strongSelf = weakSelf; if (strongSelf == nil) { return; } if (error == nil) { FIRAuthCredential *credential = [FIRGoogleAuthProvider credentialWithIDToken:result.user.idToken.tokenString accessToken:result.user.accessToken.tokenString]; // ... } else { // ... } }];
- āĻāĻĒāύāĻžāϰ āϏā§āĻā§āϰāĻŋāĻŦā§āϰā§āĻĄ, XIB āĻĢāĻžāĻāϞ⧠āĻāĻāĻāĻŋ
GIDSignInButton
āϝā§āĻ āĻāϰā§āύ āĻŦāĻž āĻāĻāĻŋāĻā§ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϝāĻžāĻāĻŋāĻāĻāĻžāĻŦā§ āĻāύāϏā§āĻā§āϝāĻžāύā§āĻāĻŋāϝāĻŧā§āĻ āĻāϰā§āύāĨ¤ āĻāĻĒāύāĻžāϰ āϏā§āĻā§āϰāĻŋāĻŦā§āϰā§āĻĄ āĻŦāĻž XIB āĻĢāĻžāĻāϞ⧠āĻŦā§āϤāĻžāĻŽ āϝā§āĻ āĻāϰāϤā§, āĻāĻāĻāĻŋ āĻāĻŋāĻ āϝā§āĻ āĻāϰā§āύ āĻāĻŦāĻ āĻāϰ āĻāĻžāϏā§āĻāĻŽ āĻā§āϞāĻžāϏGIDSignInButton
āĻ āϏā§āĻ āĻāϰā§āύāĨ¤ - āĻāĻā§āĻāĻŋāĻ : āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻŦā§āϤāĻžāĻŽāĻāĻŋ āĻāĻžāϏā§āĻāĻŽāĻžāĻāĻ āĻāϰāϤ⧠āĻāĻžāύ āϤāĻŦā§ āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤāĻā§āϞāĻŋ āĻāϰā§āύ:
āϏā§āĻāĻĢāĻ
- āĻāĻĒāύāĻžāϰ āĻāĻŋāĻ āĻāύā§āĻā§āϰā§āϞāĻžāϰā§, āϏāĻžāĻāύ-āĻāύ āĻŦā§āϤāĻžāĻŽāĻāĻŋāĻā§ āĻāĻāĻāĻŋ āϏāĻŽā§āĻĒāϤā§āϤāĻŋ āĻšāĻŋāϏāĻžāĻŦā§ āĻā§āώāĻŖāĻž āĻāϰā§āύ⧎
@IBOutlet weak var signInButton: GIDSignInButton!
- āĻāĻĒāύāĻŋ āĻāĻāĻŽāĻžāϤā§āϰ āĻā§āώāĻŋāϤ
signInButton
āϏāĻŽā§āĻĒāϤā§āϤāĻŋāϤ⧠āĻŦā§āϤāĻžāĻŽāĻāĻŋ āϏāĻāϝā§āĻā§āϤ āĻāϰā§āύāĨ¤ - GIDSignInButton āĻ āĻŦāĻā§āĻā§āĻā§āϰ āĻŦā§āĻļāĻŋāώā§āĻā§āϝ āϏā§āĻ āĻāϰ⧠āĻŦā§āϤāĻžāĻŽāĻāĻŋ āĻāĻžāϏā§āĻāĻŽāĻžāĻāĻ āĻāϰā§āύāĨ¤
āĻāĻĻā§āĻĻā§āĻļā§āϝ-C
- āĻāĻĒāύāĻžāϰ āĻāĻŋāĻ āĻāύā§āĻā§āϰā§āϞāĻžāϰā§āϰ āĻšā§āĻĄāĻžāϰ āĻĢāĻžāĻāϞā§, āϏāĻžāĻāύ-āĻāύ āĻŦā§āϤāĻžāĻŽāĻāĻŋāĻā§ āĻāĻāĻāĻŋ āϏāĻŽā§āĻĒāϤā§āϤāĻŋ āĻšāĻŋāϏāĻžāĻŦā§ āĻā§āώāĻŖāĻž āĻāϰā§āύāĨ¤
@property(weak, nonatomic) IBOutlet GIDSignInButton *signInButton;
- āĻāĻĒāύāĻŋ āĻāĻāĻŽāĻžāϤā§āϰ āĻā§āώāĻŋāϤ
signInButton
āϏāĻŽā§āĻĒāϤā§āϤāĻŋāϤ⧠āĻŦā§āϤāĻžāĻŽāĻāĻŋ āϏāĻāϝā§āĻā§āϤ āĻāϰā§āύāĨ¤ - GIDSignInButton āĻ āĻŦāĻā§āĻā§āĻā§āϰ āĻŦā§āĻļāĻŋāώā§āĻā§āϝ āϏā§āĻ āĻāϰ⧠āĻŦā§āϤāĻžāĻŽāĻāĻŋ āĻāĻžāϏā§āĻāĻŽāĻžāĻāĻ āĻāϰā§āύāĨ¤
- āĻāĻĒāύāĻžāϰ āĻāĻŋāĻ āĻāύā§āĻā§āϰā§āϞāĻžāϰā§, āϏāĻžāĻāύ-āĻāύ āĻŦā§āϤāĻžāĻŽāĻāĻŋāĻā§ āĻāĻāĻāĻŋ āϏāĻŽā§āĻĒāϤā§āϤāĻŋ āĻšāĻŋāϏāĻžāĻŦā§ āĻā§āώāĻŖāĻž āĻāϰā§āύ⧎
Firebase āĻĻāĻŋāϝāĻŧā§ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āĻāϰā§āύ
āĻ āĻŦāĻļā§āώā§, āĻĒā§āϰā§āĻŦāĻŦāϰā§āϤ⧠āϧāĻžāĻĒā§ āϤā§āϰāĻŋ āĻāϰāĻž āĻĒā§āϰāĻŽāĻžāĻŖāĻĒāϤā§āϰā§āϰ āϏāĻžāĻĨā§ Firebase āϞāĻāĻāύ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāĻŋ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻāϰā§āύāĨ¤
āϏā§āĻāĻĢāĻ
Auth.auth().signIn(with: credential) { result, error in // At this point, our user is signed in }
āĻāĻĻā§āĻĻā§āĻļā§āϝ-C
[[FIRAuth auth] signInWithCredential:credential completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) { if (isMFAEnabled && error && error.code == FIRAuthErrorCodeSecondFactorRequired) { FIRMultiFactorResolver *resolver = error.userInfo[FIRAuthErrorUserInfoMultiFactorResolverKey]; NSMutableString *displayNameString = [NSMutableString string]; for (FIRMultiFactorInfo *tmpFactorInfo in resolver.hints) { [displayNameString appendString:tmpFactorInfo.displayName]; [displayNameString appendString:@" "]; } [self showTextInputPromptWithMessage:[NSString stringWithFormat:@"Select factor to sign in\n%@", displayNameString] completionBlock:^(BOOL userPressedOK, NSString *_Nullable displayName) { FIRPhoneMultiFactorInfo* selectedHint; for (FIRMultiFactorInfo *tmpFactorInfo in resolver.hints) { if ([displayName isEqualToString:tmpFactorInfo.displayName]) { selectedHint = (FIRPhoneMultiFactorInfo *)tmpFactorInfo; } } [FIRPhoneAuthProvider.provider verifyPhoneNumberWithMultiFactorInfo:selectedHint UIDelegate:nil multiFactorSession:resolver.session completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) { if (error) { [self showMessagePrompt:error.localizedDescription]; } else { [self showTextInputPromptWithMessage:[NSString stringWithFormat:@"Verification code for %@", selectedHint.displayName] completionBlock:^(BOOL userPressedOK, NSString *_Nullable verificationCode) { FIRPhoneAuthCredential *credential = [[FIRPhoneAuthProvider provider] credentialWithVerificationID:verificationID verificationCode:verificationCode]; FIRMultiFactorAssertion *assertion = [FIRPhoneMultiFactorGenerator assertionWithCredential:credential]; [resolver resolveSignInWithAssertion:assertion completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) { if (error) { [self showMessagePrompt:error.localizedDescription]; } else { NSLog(@"Multi factor finanlize sign in succeeded."); } }]; }]; } }]; }]; } else if (error) { // ... return; } // User successfully signed in. Get user data from the FIRUser object if (authResult == nil) { return; } FIRUser *user = authResult.user; // ... }];
āĻĒāϰāĻŦāϰā§āϤ⧠āĻĒāĻĻāĻā§āώā§āĻĒ
āĻāĻāĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻĒā§āϰāĻĨāĻŽāĻŦāĻžāϰ āϏāĻžāĻāύ āĻāύ āĻāϰāĻžāϰ āĻĒāϰā§, āĻāĻāĻāĻŋ āύāϤā§āύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻ āϤā§āϰāĻŋ āĻāϰāĻž āĻšāϝāĻŧ āĻāĻŦāĻ āĻļāĻāϏāĻžāĻĒāϤā§āϰāĻā§āϞāĻŋāϰ āϏāĻžāĻĨā§ āϞāĻŋāĻā§āĻ āĻāϰāĻž āĻšāϝāĻŧâāĻ āϰā§āĻĨāĻžā§, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āύāĻžāĻŽ āĻāĻŦāĻ āĻĒāĻžāϏāĻāϝāĻŧāĻžāϰā§āĻĄ, āĻĢā§āύ āύāĻŽā§āĻŦāϰ, āĻŦāĻž āĻĒā§āϰāĻŽāĻžāĻŖ āĻĒā§āϰāĻĻāĻžāύāĻāĻžāϰā§āϰ āϤāĻĨā§āϝ â āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āϏāĻžāĻāύ āĻāύ āĻāϰā§āĻā§āύāĨ¤ āĻāĻ āύāϤā§āύ āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻāĻāĻŋ āĻāĻĒāύāĻžāϰ āĻĢāĻžāϝāĻŧāĻžāϰāĻŦā§āϏ āĻĒā§āϰāĻāϞā§āĻĒā§āϰ āĻ āĻāĻļ āĻšāĻŋāϏāĻžāĻŦā§ āϏāĻāϰāĻā§āώāĻŖ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§ āĻāĻŦāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻā§āĻāĻžāĻŦā§ āϏāĻžāĻāύ āĻāύ āĻāϰā§āύ āύāĻž āĻā§āύ, āĻāĻĒāύāĻžāϰ āĻĒā§āϰāĻāϞā§āĻĒā§āϰ āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻ ā§āϝāĻžāĻĒ āĻā§āĻĄāĻŧā§ āĻāĻāĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻā§ āĻļāύāĻžāĻā§āϤ āĻāϰāϤ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤
āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒā§, āĻāĻĒāύāĻŋ
User
āĻ āĻŦāĻā§āĻā§āĻ āĻĨā§āĻā§ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻŽā§āϞāĻŋāĻ āĻĒā§āϰā§āĻĢāĻžāĻāϞ āϤāĻĨā§āϝ āĻĒā§āϤ⧠āĻĒāĻžāϰā§āύāĨ¤ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻĻā§āϰ āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻĻā§āĻā§āύāĨ¤āĻāĻĒāύāĻžāϰ Firebase Realtime Database āĻāĻŦāĻ Cloud Storage āϏā§āϰāĻā§āώāĻž āύāĻŋāϝāĻŧāĻŽā§ , āĻāĻĒāύāĻŋ
auth
āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ āĻĨā§āĻā§ āϏāĻžāĻāύ-āĻāύ āĻāϰāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻ āύāύā§āϝ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻāĻāĻĄāĻŋ āĻĒā§āϤ⧠āĻĒāĻžāϰā§āύ āĻāĻŦāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻā§āύ āĻĄā§āĻāĻž āĻ ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āϤāĻž āύāĻŋāϝāĻŧāύā§āϤā§āϰāĻŖ āĻāϰāϤ⧠āĻāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
āĻāĻāĻāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻā§ āϏāĻžāĻāύ āĻāĻāĻ āĻāϰāϤā§, signOut:
āϏā§āĻāĻĢāĻ
let firebaseAuth = Auth.auth() do { try firebaseAuth.signOut() } catch let signOutError as NSError { print("Error signing out: %@", signOutError) }
āĻāĻĻā§āĻĻā§āĻļā§āϝ-C
NSError *signOutError; BOOL status = [[FIRAuth auth] signOut:&signOutError]; if (!status) { NSLog(@"Error signing out: %@", signOutError); return; }
āĻāĻĒāύāĻŋ āĻĒā§āϰāĻŽāĻžāĻŖā§āĻāϰāĻŖ āϤā§āϰā§āĻāĻŋāϰ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻĒāϰāĻŋāϏāϰā§āϰ āĻāύā§āϝ āϤā§āϰā§āĻāĻŋ āĻšā§āϝāĻžāύā§āĻĄāϞāĻŋāĻ āĻā§āĻĄ āϝā§āĻ āĻāϰāϤ⧠āĻāĻžāĻāϤ⧠āĻĒāĻžāϰā§āύāĨ¤ āĻšā§āϝāĻžāύā§āĻĄā§āϞ āϤā§āϰā§āĻāĻŋ āĻĻā§āĻā§āύ.