FirebaseUI āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āφāĻĒāύāĻžāϰ iOS āĻ…ā§āϝāĻžāĻĒ⧇ āϏāĻšāĻœā§‡āχ āϏāĻžāχāύ-āχāύ āĻ•āϰ⧁āύ

FirebaseUI āĻšāϞ Firebase āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ SDK-āĻāϰ āωāĻĒāϰ⧇ āύāĻŋāĻ°ā§āĻŽāĻŋāϤ āĻāĻ•āϟāĻŋ āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āϝāĻž āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āϜāĻ¨ā§āϝ āĻĄā§āϰāĻĒ-āχāύ UI āĻĢā§āϞ⧋ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇āĨ¤ FirebaseUI āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āϏ⧁āĻŦāĻŋāϧāĻž āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇:

  • āĻāĻ•āĻžāϧāĻŋāĻ• āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀ : āχāĻŽā§‡āϞ/āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ, āχāĻŽā§‡āϞ āϞāĻŋāĻ™ā§āĻ•, āĻĢā§‹āύ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ, āϗ⧁āĻ—āϞ āϏāĻžāχāύ-āχāύ, āĻĢ⧇āϏāĻŦ⧁āĻ• āϞāĻ—āχāύ āĻāĻŦāĻ‚ āϟ⧁āχāϟāĻžāϰ āϞāĻ—āχāύ⧇āϰ āϜāĻ¨ā§āϝ āϏāĻžāχāύ-āχāύ āĻĒā§āϰāĻŦāĻžāĻšāĨ¤
  • āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻŽā§āϝāĻžāύ⧇āϜāĻŽā§‡āĻ¨ā§āϟ : āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āĻŽā§āϝāĻžāύ⧇āϜāĻŽā§‡āĻ¨ā§āĻŸā§‡āϰ āĻ•āĻžāϜāϗ⧁āϞāĻŋ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāϤ⧇ āĻĒā§āϰāĻŦāĻžāĻšāĻŋāϤ āĻšāϝāĻŧ, āϝ⧇āĻŽāύ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϤ⧈āϰāĻŋ āĻāĻŦāĻ‚ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āϰāĻŋāϏ⧇āϟāĨ¤
  • āĻŦ⧇āύāĻžāĻŽā§€ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϞāĻŋāĻ™ā§āĻ•āĻŋāĻ‚ : āĻĒāϰāĻŋāϚāϝāĻŧ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀āϰ āϏāĻžāĻĨ⧇ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āĻŦ⧇āύāĻžāĻŽā§€ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϞāĻŋāĻ™ā§āĻ• āĻ•āϰāϤ⧇ āĻĒā§āϰāĻŦāĻžāĻšāĨ¤
  • āĻ•āĻžāĻ¸ā§āϟāĻŽāĻžāχāϜāϝ⧋āĻ—ā§āϝ : āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇āϰ āϏāĻžāĻĨ⧇ āĻŽāĻŋāϞ āϰāĻžāĻ–āϤ⧇ FirebaseUI āĻāϰ āĻšā§‡āĻšāĻžāϰāĻž āĻ•āĻžāĻ¸ā§āϟāĻŽāĻžāχāϜ āĻ•āϰ⧁āύāĨ¤ āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“, āϝ⧇āĻšā§‡āϤ⧁ āĻĢāĻžāϝāĻŧāĻžāϰāĻŦ⧇āϏāχāωāφāχ āĻ“āĻĒ⧇āύ āϏ⧋āĻ°ā§āϏ, āφāĻĒāύāĻŋ āĻĒā§āϰāĻœā§‡āĻ•ā§āϟāϟāĻŋāϕ⧇ āĻ•āĻžāρāϟāĻžāϚāĻžāĻŽāϚ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ āĻāĻŦāĻ‚ āĻāϟāĻŋāϕ⧇ āφāĻĒāύāĻžāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻ…āύ⧁āϏāĻžāϰ⧇ āĻ•āĻžāĻ¸ā§āϟāĻŽāĻžāχāϜ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

āφāĻĒāύāĻŋ āĻļ⧁āϰ⧁ āĻ•āϰāĻžāϰ āφāϗ⧇

  1. āφāĻĒāύāĻžāϰ Apple āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇ Firebase āϝ⧋āĻ— āĻ•āϰ⧁āύ āĨ¤

  2. āφāĻĒāύāĻžāϰ āĻĒāĻĄāĻĢāĻžāχāϞ⧇ FirebaseUI āϝ⧋āĻ— āĻ•āϰ⧁āύ:

    pod 'FirebaseUI'
    

    āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āϰ⧇āύ, āφāĻĒāύāĻŋ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āωāĻĒāĻžāĻĻāĻžāύ āĻāĻŦāĻ‚ āφāĻĒāύāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āϚāĻžāύ āĻāĻŽāύ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀ āϝ⧋āĻ— āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ:

    pod 'FirebaseUI/Auth'
    
    pod 'FirebaseUI/Google'
    pod 'FirebaseUI/Facebook'
    pod 'FirebaseUI/OAuth' # Used for Sign in with Apple, Twitter, etc
    pod 'FirebaseUI/Phone'
    
  3. āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāĻ–āύāĻ“ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒāϟāĻŋāϕ⧇ āφāĻĒāύāĻžāϰ Firebase āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āύāĻž āĻ•āϰ⧇ āĻĨāĻžāϕ⧇āύ, āϤāĻžāĻšāϞ⧇ Firebase āĻ•āύāϏ⧋āϞ āĻĨ⧇āϕ⧇ āϤāĻž āĻ•āϰ⧁āύ⧎

āϏāĻžāχāύ-āχāύ āĻĒāĻĻā§āϧāϤāĻŋ āϏ⧇āϟ āφāĻĒ āĻ•āϰ⧁āύ

āφāĻĒāύāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āϏāĻžāχāύ āχāύ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ Firebase āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āφāϗ⧇, āφāĻĒāύāĻŋ āϝ⧇ āϏāĻžāχāύ-āχāύ āĻĒāĻĻā§āϧāϤāĻŋāϗ⧁āϞāĻŋ āϏāĻŽāĻ°ā§āĻĨāύ āĻ•āϰāϤ⧇ āϚāĻžāύ āϤāĻž āϏāĻ•ā§āώāĻŽ āĻāĻŦāĻ‚ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤

āχāĻŽā§‡āϞ āĻ āĻŋāĻ•āĻžāύāĻž āĻāĻŦāĻ‚ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ

Firebase āĻ•āύāϏ⧋āϞ⧇ , āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻŦāĻŋāĻ­āĻžāĻ—āϟāĻŋ āϖ⧁āϞ⧁āύ āĻāĻŦāĻ‚ āχāĻŽā§‡āϞ āĻāĻŦāĻ‚ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āϏāĻ•ā§āώāĻŽ āĻ•āϰ⧁āύāĨ¤

  1. Firebase āĻ•āύāϏ⧋āϞ⧇ , āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻŦāĻŋāĻ­āĻžāĻ—āϟāĻŋ āϖ⧁āϞ⧁āύāĨ¤ āϏāĻžāχāύ āχāύ āĻĒāĻĻā§āϧāϤāĻŋ āĻŸā§āϝāĻžāĻŦ⧇, āχāĻŽā§‡āϞ/āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀ āϏāĻ•ā§āώāĻŽ āĻ•āϰ⧁āύāĨ¤ āĻŽāύ⧇ āϰāĻžāĻ–āĻŦ⧇āύ āϝ⧇ āχāĻŽā§‡āϞ āϞāĻŋāĻ™ā§āĻ• āϏāĻžāχāύ-āχāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āχāĻŽā§‡āϞ āĻŦāĻž āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āϏāĻžāχāύ-āχāύ āϏāĻ•ā§āϰāĻŋāϝāĻŧ āĻ•āϰāĻž āφāĻŦāĻļā§āϝāĻ•āĨ¤

  2. āĻāĻ•āχ āĻŦāĻŋāĻ­āĻžāϗ⧇, āχāĻŽā§‡āϞ āϞāĻŋāĻ™ā§āĻ• (āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄāĻšā§€āύ āϏāĻžāχāύ-āχāύ) āϏāĻžāχāύ-āχāύ āĻĒāĻĻā§āϧāϤāĻŋ āϏāĻ•ā§āώāĻŽ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧁āύ āĻ•ā§āϞāĻŋāĻ• āĻ•āϰ⧁āύāĨ¤

  3. āφāĻĒāύāĻŋ FIREmailLinkAuthSignInMethod āĻāϰ āϏāĻžāĻĨ⧇ āĻāĻ•āϟāĻŋ FUIEmailAuth āχāύāĻ¸ā§āĻŸā§āϝāĻžāĻ¨ā§āϏ āĻļ⧁āϰ⧁ āĻ•āϰ⧇ āχāĻŽā§‡āϞ āϞāĻŋāĻ™ā§āĻ• āϏāĻžāχāύ āχāύ āϏāĻ•ā§āώāĻŽ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“ āφāĻĒāύāĻžāϕ⧇ āĻāĻ•āϟāĻŋ āĻŦ⧈āϧ FIRActionCodeSettings āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āϏāϰāĻŦāϰāĻžāĻš āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āϝāĻžāϤ⧇ handleCodeInApp āϏāĻ¤ā§āϝ āϏ⧇āϟ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤

āϏ⧁āχāĻĢāϟ

var actionCodeSettings = ActionCodeSettings()
actionCodeSettings.url = URL(string: "https://example.firebasestorage.app")
actionCodeSettings.handleCodeInApp = true
actionCodeSettings.setAndroidPackageName("com.firebase.example", installIfNotAvailable: false, minimumVersion: "12")

let provider = FUIEmailAuth(authUI: FUIAuth.defaultAuthUI()!,
                            signInMethod: FIREmailLinkAuthSignInMethod,
                            forceSameDevice: false,
                            allowNewEmailAccounts: true,
                            actionCodeSetting: actionCodeSettings)

āωāĻĻā§āĻĻ⧇āĻļā§āϝ-C

FIRActionCodeSettings *actionCodeSettings = [[FIRActionCodeSettings alloc] init];
actionCodeSettings.URL = [NSURL URLWithString:@"https://example.firebasestorage.app"];
actionCodeSettings.handleCodeInApp = YES;
[actionCodeSettings setAndroidPackageName:@"com.firebase.example"
                    installIfNotAvailable:NO
                           minimumVersion:@"12"];

id<FUIAuthProvider> provider = [[FUIEmailAuth alloc] initWithAuthUI:[FUIAuth defaultAuthUI]
                                                       signInMethod:FIREmailLinkAuthSignInMethod
                                                    forceSameDevice:NO
                                              allowNewEmailAccounts:YES
                                                  actionCodeSetting:actionCodeSettings];
  1. āωāĻĒāϰāĻ¨ā§āϤ⧁, āφāĻĒāύāĻŋ āχāύāĻŋāĻļāĻŋāϝāĻŧāĻžāϞāĻžāχāϜāĻžāϰ⧇āϰ āĻ•āĻžāϛ⧇ āϝ⧇ URLāϟāĻŋ āĻĒāĻžāϏ āĻ•āϰ⧇āύ āϤāĻž āφāĻĒāύāĻžāϕ⧇ āϏāĻžāĻĻāĻž āϤāĻžāϞāĻŋāĻ•āĻžāϭ⧁āĻ•ā§āϤ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤ āφāĻĒāύāĻŋ Firebase āĻ•āύāϏ⧋āϞ⧇ āĻāϟāĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ, āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻŦāĻŋāĻ­āĻžāĻ—āϟāĻŋ āϖ⧁āϞ⧁āύāĨ¤ āϏāĻžāχāύ āχāύ āĻĒāĻĻā§āϧāϤāĻŋ āĻŸā§āϝāĻžāĻŦ⧇, āĻ…āύ⧁āĻŽā§‹āĻĻāĻŋāϤ āĻĄā§‹āĻŽā§‡āύ⧇āϰ āĻ…āϧ⧀āύ⧇ URL āϝ⧋āĻ— āĻ•āϰ⧁āύāĨ¤

  2. āĻāĻ•āĻŦāĻžāϰ āφāĻĒāύāĻŋ āĻĄāĻŋāĻĒ āϞāĻŋāĻ™ā§āĻ•āϟāĻŋ āϧāϰāϞ⧇, āφāĻĒāύāĻžāϕ⧇ āĻāϟāĻŋ auth UI-āϤ⧇ āĻĒāĻžāϏ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āϝāĻžāϤ⧇ āĻāϟāĻŋ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāĻž āϝāĻžāϝāĻŧāĨ¤

āϏ⧁āχāĻĢāϟ

FUIAuth.defaultAuthUI()!.handleOpen(url, sourceApplication: sourceApplication)

āωāĻĻā§āĻĻ⧇āĻļā§āϝ-C

[[FUIAuth defaultAuthUI] handleOpenURL:url sourceApplication:sourceApplication];
  1. FirebaseUI-iOS-āĻ āχāĻŽā§‡āϞ āϞāĻŋāĻ™ā§āĻ• āϏāĻžāχāύ-āχāύ FirebaseUI-Android āĻāĻŦāĻ‚ FirebaseUI-āĻ“āϝāĻŧ⧇āĻŦ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻžāĻŽāĻžā§āϜāĻ¸ā§āϝāĻĒā§‚āĻ°ā§āĻŖ āϝ⧇āĻ–āĻžāύ⧇ āĻāĻ•āϜāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ FirebaseUI-Android āĻĨ⧇āϕ⧇ āĻĢā§āϞ⧋ āĻļ⧁āϰ⧁ āĻ•āϰ⧇ FirebaseUI-āĻ“āϝāĻŧ⧇āĻŦ⧇āϰ āϏāĻžāĻĨ⧇ āϞāĻŋāĻ™ā§āĻ•āϟāĻŋ āϖ⧁āϞāϤ⧇ āĻāĻŦāĻ‚ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āϏāĻžāχāύ-āχāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻŦāĻŋāĻĒāϰ⧀āϤ āĻĒā§āϰāĻŦāĻžāĻšā§‡āϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇āĻ“ āĻāĻ•āχ āĻ•āĻĨāĻž āĻĒā§āϰāϝ⧋āĻœā§āϝāĨ¤

āφāĻĒ⧇āϞ

  1. āφāĻĒāύāĻŋ āĻļ⧁āϰ⧁ āĻ•āϰāĻžāϰ āφāϗ⧇ āĻāĻŦāĻ‚ Apple āĻ—āĻžāχāĻĄā§‡āϰ āϏāĻžāĻĨ⧇ Firebase āϏāĻžāχāύ āχāύ āĻ•āϰ⧁āύ āĻ…ā§āϝāĻžāĻĒāϞ āĻŦ⧇āύāĻžāĻŽā§€ āĻĄā§‡āϟāĻž āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧāϤāĻž āĻŦāĻŋāĻ­āĻžāĻ—āϗ⧁āϞāĻŋ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰ⧁āύ⧎

  2. āφāĻĒāύāĻžāϰ āĻāύāϟāĻžāχāĻŸā§‡āϞāĻŽā§‡āĻ¨ā§āϟ āĻĢāĻžāχāϞ⧇ Apple āϏāĻ•ā§āώāĻŽāϤāĻžāϰ āϏāĻžāĻĨ⧇ āϏāĻžāχāύ āχāύ āϝ⧋āĻ— āĻ•āϰ⧁āύāĨ¤

  3. āĻ…ā§āϝāĻžāĻĒāϞ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻžāχāύ āχāύ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰāĻž āĻāĻ•āϟāĻŋ OAuth āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀āϰ āĻĻ⧃āĻˇā§āϟāĻžāĻ¨ā§āϤ āĻļ⧁āϰ⧁ āĻ•āϰ⧁āύ:

    āϏ⧁āχāĻĢāϟ

    provider = FUIOAuth.appleAuthProvider()

    āωāĻĻā§āĻĻ⧇āĻļā§āϝ-C

    FUIOAuth *provider = [FUIOAuth appleAuthProvider];

āϗ⧁āĻ—āϞ

  1. āĻāχ āϟāĻŋāωāĻŸā§‹āϰāĻŋāϝāĻŧāĻžāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ Google āϏāĻžāχāύ-āχāύ āϏ⧇āϟ āφāĻĒ āĻ•āϰ⧁āύ

āĻĢ⧇āϏāĻŦ⧁āĻ•

  1. Facebook-āĻāϰ āĻļ⧁āϰ⧁āϰ āĻĒ⧃āĻˇā§āĻ āĻž āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰ⧇ Facebook āϞāĻ—āχāύ SDK āϏ⧇āϟ āφāĻĒ āĻ•āϰ⧁āύ⧎

  2. Firebase āĻ•āύāϏ⧋āϞ⧇ , āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻŦāĻŋāĻ­āĻžāĻ—āϟāĻŋ āϖ⧁āϞ⧁āύ āĻāĻŦāĻ‚ Facebook āϏāĻ•ā§āώāĻŽ āĻ•āϰ⧁āύ⧎ Facebook āϏāĻžāχāύ-āχāύ āϏāĻ•ā§āώāĻŽ āĻ•āϰāϤ⧇, āφāĻĒāύāĻžāϕ⧇ āĻ…āĻŦāĻļā§āϝāχ āφāĻĒāύāĻžāϰ Facebook āĻ…ā§āϝāĻžāĻĒ āφāχāĻĄāĻŋ āĻāĻŦāĻ‚ āĻ…ā§āϝāĻžāĻĒ āϏāĻŋāĻ•ā§āϰ⧇āϟ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇, āϝāĻž āφāĻĒāύāĻŋ Facebook āĻŦāĻŋāĻ•āĻžāĻļāĻ•āĻžāϰ⧀ āĻ•āύāϏ⧋āϞ⧇ āĻĒ⧇āϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

  3. āĻĒā§āϰāĻœā§‡āĻ•ā§āϟ āϏ⧇āϟāĻŋāĻ‚āϏ > āϏāĻ•ā§āώāĻŽāϤāĻž āĻ¸ā§āĻ•ā§āϰ⧀āύ āĻĨ⧇āϕ⧇ āφāĻĒāύāĻžāϰ Xcode āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇ āϕ⧀āĻšā§‡āύ āĻļ⧇āϝāĻŧāĻžāϰāĻŋāĻ‚ āϏāĻ•ā§āώāĻŽ āĻ•āϰ⧁āύāĨ¤

  4. āφāĻĒāύāĻžāϰ Xcode āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇ āĻāĻ•āϟāĻŋ URL āĻ¸ā§āĻ•āĻŋāĻŽ āĻšāĻŋāϏāĻžāĻŦ⧇ fb FACEBOOK_APP_ID āϝ⧋āĻ— āĻ•āϰ⧁āύāĨ¤

  5. Info.plist āĻĢāĻžāχāϞ⧇ āφāĻĒāύāĻžāϰ Facebook āĻ…ā§āϝāĻžāĻĒ āφāχāĻĄāĻŋ āĻāĻŦāĻ‚ āĻĒā§āϰāĻĻāĻ°ā§āĻļāύ⧇āϰ āύāĻžāĻŽ āϝ⧋āĻ— āĻ•āϰ⧁āύ:

    āϚāĻžāĻŦāĻŋ āĻŽāĻžāύ
    FacebookAppID FACEBOOK_APP_ID (āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, 1234567890 )
    FacebookDisplayName āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇āϰ āύāĻžāĻŽ
  6. āĻāĻ•āϟāĻŋ Facebook āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀ āωāĻĻāĻžāĻšāϰāĻŖ āĻļ⧁āϰ⧁ āĻ•āϰ⧁āύ:

    āϏ⧁āχāĻĢāϟ

    provider = FUIFacebookAuth(authUI: FUIAuth.defaultAuthUI())

    āωāĻĻā§āĻĻ⧇āĻļā§āϝ-C

    FUIFacebookAuth *provider = [[FUIFacebookAuth alloc] initWithAuthUI:[FUIAuth defaultAuthUI]];

  7. āφāĻĒāύāĻŋ āϝāĻĻāĻŋ Facebook Limited Login āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āϚāĻžāύ, FUIFacebookAuth āωāĻĻāĻžāĻšāϰāϪ⧇ useLimitedLogin āĻĒā§āϰāĻĒāĻžāĻ°ā§āϟāĻŋ āϏ⧇āϟ āĻ•āϰ⧁āύāĨ¤

    āϏ⧁āχāĻĢāϟ

    provider.useLimitedLogin = true

    āωāĻĻā§āĻĻ⧇āĻļā§āϝ-C

    provider.useLimitedLogin = YES;

āϟ⧁āχāϟāĻžāϰ

  1. Firebase āĻ•āύāϏ⧋āϞ⧇ , āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻŦāĻŋāĻ­āĻžāĻ—āϟāĻŋ āϖ⧁āϞ⧁āύ āĻāĻŦāĻ‚ Twitter āϏāĻ•ā§āώāĻŽ āĻ•āϰ⧁āύ⧎ Twitter āϏāĻžāχāύ-āχāύ āϏāĻ•ā§āώāĻŽ āĻ•āϰāϤ⧇, āφāĻĒāύāĻžāϕ⧇ āĻ…āĻŦāĻļā§āϝāχ āφāĻĒāύāĻžāϰ Twitter API āĻ—ā§āϰāĻžāĻšāĻ• āϕ⧀ āĻāĻŦāĻ‚ āĻ—ā§‹āĻĒāύ⧀āϝāĻŧāϤāĻž āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇, āϝāĻž āφāĻĒāύāĻŋ Twitter āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āĻŽā§āϝāĻžāύ⧇āϜāĻŽā§‡āĻ¨ā§āϟ āĻ•āύāϏ⧋āϞ⧇ āĻĒ⧇āϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

  2. āϟ⧁āχāϟāĻžāϰ āϞāĻ—āχāύ⧇āϰ āϜāĻ¨ā§āϝ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰāĻž āĻāĻ•āϟāĻŋ OAuth āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀āϰ āĻĻ⧃āĻˇā§āϟāĻžāĻ¨ā§āϤ āĻļ⧁āϰ⧁ āĻ•āϰ⧁āύ:

    āϏ⧁āχāĻĢāϟ

    provider = FUIOAuth.twitterAuthProvider()

    āωāĻĻā§āĻĻ⧇āĻļā§āϝ-C

    FUIOAuth *provider = [FUIOAuth twitterAuthProvider];

āĻĢā§‹āύ āύāĻŽā§āĻŦāϰ

  1. Firebase āĻ•āύāϏ⧋āϞ⧇ , āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻŦāĻŋāĻ­āĻžāĻ—āϟāĻŋ āϖ⧁āϞ⧁āύ āĻāĻŦāĻ‚ āĻĢā§‹āύ āύāĻŽā§āĻŦāϰ āϏāĻžāχāύ-āχāύ āϏāĻ•ā§āώāĻŽ āĻ•āϰ⧁āύ⧎

  2. Firebase āĻ…āĻŦāĻļā§āϝāχ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ āĻĨ⧇āϕ⧇ āĻĢā§‹āύ āύāĻŽā§āĻŦāϰ āϏāĻžāχāύ-āχāύ āĻ…āύ⧁āϰ⧋āϧ āφāϏāϛ⧇ āϤāĻž āϝāĻžāϚāĻžāχ āĻ•āϰāϤ⧇ āϏāĻ•ā§āώāĻŽ āĻšāĻŦ⧇āĨ¤ āĻāϟāĻŋ āϏāĻŽā§āĻĒāĻ¨ā§āύ āĻ•āϰāĻžāϰ āĻāĻ•āϟāĻŋ āωāĻĒāĻžāϝāĻŧ āĻšāϞ APN-āĻāϰ āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡āĨ¤ āĻŦāĻŋāĻ¸ā§āϤāĻžāϰāĻŋāϤ āϜāĻžāύāĻžāϰ āϜāĻ¨ā§āϝ āĻ…ā§āϝāĻžāĻĒ āϝāĻžāϚāĻžāχāĻ•āϰāĻŖ āϏāĻ•ā§āώāĻŽ āĻ•āϰ⧁āύ āĻĻ⧇āϖ⧁āύāĨ¤

    Firebase Authentication āϏāĻžāĻĨ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āϜāĻ¨ā§āϝ APN-āĻāϰ āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋ āϏāĻ•ā§āώāĻŽ āĻ•āϰāϤ⧇:

    1. āĻāĻ•ā§āϏāϕ⧋āĻĄā§‡, āφāĻĒāύāĻžāϰ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āϜāĻ¨ā§āϝ āĻĒ⧁āĻļ āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋāϗ⧁āϞāĻŋ āϏāĻ•ā§āώāĻŽ āĻ•āϰ⧁āύ āĨ¤

    2. Firebase-āĻ āφāĻĒāύāĻžāϰ APN-āĻāϰ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āϕ⧀ āφāĻĒāϞ⧋āĻĄ āĻ•āϰ⧁āύāĨ¤ āϝāĻĻāĻŋ āφāĻĒāύāĻžāϰ āĻ•āĻžāϛ⧇ āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇ āĻāĻ•āϟāĻŋ APN-āĻāϰ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āϕ⧀ āύāĻž āĻĨāĻžāϕ⧇, āϤāĻžāĻšāϞ⧇ Apple āĻŦāĻŋāĻ•āĻžāĻļāĻ•āĻžāϰ⧀ āϏāĻĻāĻ¸ā§āϝ āϕ⧇āĻ¨ā§āĻĻā§āϰ⧇ āĻāĻ•āϟāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰ⧁āύ⧎

      1. Firebase āĻ•āύāϏ⧋āϞ⧇ āφāĻĒāύāĻžāϰ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āĻ­āĻŋāϤāϰ⧇, āĻ—āĻŋāϝāĻŧāĻžāϰ āφāχāĻ•āύ āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧁āύ, āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ āϏ⧇āϟāĻŋāĻ‚āϏ āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āϤāĻžāϰāĻĒāϰ⧇ āĻ•ā§āϞāĻžāωāĻĄ āĻŽā§‡āϏ⧇āϜāĻŋāĻ‚ āĻŸā§āϝāĻžāĻŦāϟāĻŋ āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧁āύ⧎

      2. iOS āĻ…ā§āϝāĻžāĻĒ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ⧇āϰ āĻ…āϧ⧀āύ⧇ APN-āĻāϰ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āϕ⧀- āϤ⧇, āφāĻĒāύāĻžāϰ āĻĄā§‡āϭ⧇āϞāĻĒāĻŽā§‡āĻ¨ā§āϟ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āϕ⧀, āĻ…āĻĨāĻŦāĻž āĻ‰ā§ŽāĻĒāĻžāĻĻāύ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āϕ⧀, āĻŦāĻž āωāĻ­āϝāĻŧāχ āφāĻĒāϞ⧋āĻĄ āĻ•āϰāϤ⧇ āφāĻĒāϞ⧋āĻĄ āĻŦā§‹āϤāĻžāĻŽā§‡ āĻ•ā§āϞāĻŋāĻ• āĻ•āϰ⧁āύāĨ¤ āĻ…āĻ¨ā§āϤāϤ āĻāĻ•āϟāĻŋ āĻĒā§āϰāϝāĻŧā§‹āϜāύ.

      3. āφāĻĒāύāĻŋ āϝ⧇āĻ–āĻžāύ⧇ āφāĻĒāύāĻžāϰ āϕ⧀ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧇āϛ⧇āύ āϏ⧇āĻ–āĻžāύ⧇ āĻŦā§āϰāĻžāωāϜ āĻ•āϰ⧁āύ, āĻāϟāĻŋ āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āϖ⧁āϞ⧁āύ āĻ•ā§āϞāĻŋāĻ• āĻ•āϰ⧁āύāĨ¤ āϕ⧀āϟāĻŋāϰ āϜāĻ¨ā§āϝ āϕ⧀ āφāχāĻĄāĻŋ āϝ⧋āĻ— āĻ•āϰ⧁āύ ( āĻ…ā§āϝāĻžāĻĒāϞ āĻŦāĻŋāĻ•āĻžāĻļāĻ•āĻžāϰ⧀ āϏāĻĻāĻ¸ā§āϝ āϕ⧇āĻ¨ā§āĻĻā§āϰ⧇ āωāĻĒāϞāĻŦā§āϧ) āĻāĻŦāĻ‚ āφāĻĒāϞ⧋āĻĄ āĻ•ā§āϞāĻŋāĻ• āĻ•āϰ⧁āύāĨ¤

      āφāĻĒāύāĻžāϰ āϝāĻĻāĻŋ āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇āχ āĻāĻ•āϟāĻŋ APNs āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰ āĻĨāĻžāϕ⧇, āϤāĻžāĻšāϞ⧇ āφāĻĒāύāĻŋ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇ āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰāϟāĻŋ āφāĻĒāϞ⧋āĻĄ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ⧎

  3. āϝāĻ–āύ āϕ⧋āύ⧋ āĻĄāĻŋāĻ­āĻžāχāϏ⧇ APN-āĻāϰ āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋ āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāϝāĻŧ āύāĻž, āϤāĻ–āύ Firebase āĻ…āύ⧁āϰ⧋āϧāϗ⧁āϞāĻŋ āϝāĻžāϚāĻžāχ āĻ•āϰāϤ⧇ reCAPTCHA āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĨ¤

    reCAPTCHA āϝāĻžāϚāĻžāχāĻ•āϰāĻŖ āϏāĻ•ā§āώāĻŽ āĻ•āϰāϤ⧇, Xcode-āĻ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤāϗ⧁āϞāĻŋ āĻ•āϰ⧁āύ:

    1. āφāĻĒāύāĻžāϰ āĻĒā§āϰāĻœā§‡āĻ•ā§āϟ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āϖ⧁āϞ⧁āύ: āĻŦāĻžāĻŽ āĻŸā§āϰāĻŋ āĻ­āĻŋāωāϤ⧇ āĻĒā§āϰāĻœā§‡āĻ•ā§āĻŸā§‡āϰ āύāĻžāĻŽā§‡ āĻĄāĻžāĻŦāϞ āĻ•ā§āϞāĻŋāĻ• āĻ•āϰ⧁āύāĨ¤ āϞāĻ•ā§āĻˇā§āϝ āĻŦāĻŋāĻ­āĻžāĻ— āĻĨ⧇āϕ⧇ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒāϟāĻŋ āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧁āύ, āϤāĻžāϰāĻĒāϰ āϤāĻĨā§āϝ āĻŸā§āϝāĻžāĻŦāϟāĻŋ āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ URL āĻĒā§āϰāĻ•āĻžāϰ āĻŦāĻŋāĻ­āĻžāĻ—āϟāĻŋ āĻĒā§āϰāϏāĻžāϰāĻŋāϤ āĻ•āϰ⧁āύ⧎
    2. + āĻŦā§‹āϤāĻžāĻŽā§‡ āĻ•ā§āϞāĻŋāĻ• āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ URL āĻ¸ā§āĻ•āĻŋāĻŽ āĻšāĻŋāϏāĻžāĻŦ⧇ āφāĻĒāύāĻžāϰ āĻāύāϕ⧋āĻĄ āĻ•āϰāĻž āĻ…ā§āϝāĻžāĻĒ āφāχāĻĄāĻŋ āϝ⧋āĻ— āĻ•āϰ⧁āύāĨ¤ āφāĻĒāύāĻŋ āφāĻĒāύāĻžāϰ iOS āĻ…ā§āϝāĻžāĻĒ⧇āϰ āĻŦāĻŋāĻ­āĻžāϗ⧇ Firebase āĻ•āύāϏ⧋āϞ⧇āϰ āϏāĻžāϧāĻžāϰāĻŖ āϏ⧇āϟāĻŋāĻ‚āϏ āĻĒ⧃āĻˇā§āĻ āĻžāϝāĻŧ āφāĻĒāύāĻžāϰ āĻāύāϕ⧋āĻĄ āĻ•āϰāĻž āĻ…ā§āϝāĻžāĻĒ āφāχāĻĄāĻŋ āϖ⧁āρāĻœā§‡ āĻĒ⧇āϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻ•ā§āώ⧇āĻ¤ā§āϰāϗ⧁āϞāĻŋ āĻĢāĻžāρāĻ•āĻž āϰāĻžāϖ⧁āύāĨ¤

      āϏāĻŽā§āĻĒāĻ¨ā§āύ āĻšāϞ⧇, āφāĻĒāύāĻžāϰ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύāϟāĻŋ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤāϗ⧁āϞāĻŋāϰ āĻŽāϤ⧋ āĻĻ⧇āĻ–āϤ⧇ āĻšāĻŦ⧇ (āĻ•āĻŋāĻ¨ā§āϤ⧁ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ-āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻŽāĻžāύāϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇):

      Xcode āĻāϰ āĻ•āĻžāĻ¸ā§āϟāĻŽ URL āĻ¸ā§āĻ•āĻŋāĻŽ āϏ⧇āϟāφāĻĒ āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ⧇āϰ āĻ¸ā§āĻ•ā§āϰāĻŋāύāĻļāϟ
  4. āϐāĻšā§āĻ›āĻŋāĻ• : Firebase āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇āϰ APN āĻŸā§‹āϕ⧇āύ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āĻĒ⧇āϤ⧇, Firebase āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇ āϝ⧇ āύ⧀āϰāĻŦ āĻĒ⧁āĻļ āĻŦāĻŋāĻœā§āĻžāĻĒā§āϤāĻŋ āĻĒāĻžāĻ āĻžāϝāĻŧ āϤāĻž āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāϤ⧇ āĻāĻŦāĻ‚ āϝāĻžāϚāĻžāχāĻ•āϰāϪ⧇āϰ āϏāĻŽāϝāĻŧ reCAPTCHA āϝāĻžāϚāĻžāχāĻ•āϰāĻŖ āĻĒ⧃āĻˇā§āĻ āĻž āĻĨ⧇āϕ⧇ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āĻ•āĻžāĻ¸ā§āϟāĻŽ āĻ¸ā§āĻ•āĻŋāĻŽ āĻĒ⧁āύāσāύāĻŋāĻ°ā§āĻĻ⧇āĻļāϕ⧇ āĻŦāĻžāϧāĻž āĻĻāĻŋāϤ⧇ āĻŽā§‡āĻĨāĻĄ āϏ⧁āχāϜāϞāĻŋāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĨ¤

    āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āϏ⧁āχāϜāϞāĻŋāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰ āύāĻž āĻ•āϰāϤ⧇ āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āϰ⧇āύ, āϤāĻžāĻšāϞ⧇ āĻĒāϰāĻŋāĻļāĻŋāĻˇā§āϟ āĻĻ⧇āϖ⧁āύ: Firebase SDK āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻĄāĻ•ā§āϏ⧇ āϏ⧁āχāϜāϞāĻŋāĻ‚ āύāĻž āĻ•āϰ⧇ āĻĢā§‹āύ āϏāĻžāχāύ-āχāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĨ¤

āϏāĻžāχāύ āχāύ āĻ•āϰ⧁āύ

FirebaseUI āϏāĻžāχāύ āχāύ āĻĢā§āϞ⧋ āĻļ⧁āϰ⧁ āĻ•āϰāϤ⧇, āĻĒā§āϰāĻĨāĻŽā§‡ FirebaseUI āĻļ⧁āϰ⧁ āĻ•āϰ⧁āύ:

āϏ⧁āχāĻĢāϟ

import FirebaseAuthUI

/* ... */

FirebaseApp.configure()
let authUI = FUIAuth.defaultAuthUI()
// You need to adopt a FUIAuthDelegate protocol to receive callback
authUI.delegate = self

āωāĻĻā§āĻĻ⧇āĻļā§āϝ-C

@import FirebaseAuthUI;

...

[FIRApp configure];
FUIAuth *authUI = [FUIAuth defaultAuthUI];
// You need to adopt a FUIAuthDelegate protocol to receive callback
authUI.delegate = self;

āϤāĻžāϰāĻĒāϰ, āφāĻĒāύāĻŋ āϏāĻŽāĻ°ā§āĻĨāύ āĻ•āϰāϤ⧇ āϚāĻžāύ āĻāĻŽāύ āϏāĻžāχāύ-āχāύ āĻĒāĻĻā§āϧāϤāĻŋāϗ⧁āϞāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ FirebaseUI āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰ⧁āύ:

āϏ⧁āχāĻĢāϟ

import FirebaseAuthUI
import FirebaseFacebookAuthUI
import FirebaseGoogleAuthUI
import FirebaseOAuthUI
import FirebasePhoneAuthUI

let providers: [FUIAuthProvider] = [
  FUIGoogleAuth(),
  FUIFacebookAuth(),
  FUITwitterAuth(),
  FUIPhoneAuth(authUI:FUIAuth.defaultAuthUI()),
]
self.authUI.providers = providers

āωāĻĻā§āĻĻ⧇āĻļā§āϝ-C

@import FirebaseAuthUI;
@import FirebaseFacebookAuthUI;
@import FirebaseGoogleAuthUI;
@import FirebaseOAuthUI;
@import FirebasePhoneAuthUI;

...

NSArray<id<FUIAuthProvider>> *providers = @[
  [[FUIGoogleAuth alloc] init],
  [[FUIFacebookAuth alloc] init],
  [[FUITwitterAuth alloc] init],
  [[FUIPhoneAuth alloc] initWithAuthUI:[FUIAuth defaultAuthUI]]
];
_authUI.providers = providers;

āφāĻĒāύāĻŋ Google āĻŦāĻž Facebook āϏāĻžāχāύ-āχāύ āϏāĻ•ā§āώāĻŽ āĻ•āϰāϞ⧇, Google āĻāĻŦāĻ‚ Facebook āϏāĻžāχāύ-āφāĻĒ āĻĒā§āϰāĻŦāĻžāĻšā§‡āϰ āĻĢāϞāĻžāĻĢāϞ⧇āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻšā§āϝāĻžāĻ¨ā§āĻĄāϞāĻžāϰ āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ•āϰ⧁āύ:

āϏ⧁āχāĻĢāϟ

func application(_ app: UIApplication, open url: URL,
    options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {
  let sourceApplication = options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String?
  if FUIAuth.defaultAuthUI()?.handleOpen(url, sourceApplication: sourceApplication) ?? false {
    return true
  }
  // other URL handling goes here.
  return false
}

āωāĻĻā§āĻĻ⧇āĻļā§āϝ-C

- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary *)options {
  NSString *sourceApplication = options[UIApplicationOpenURLOptionsSourceApplicationKey];
  return [[FUIAuth defaultAuthUI] handleOpenURL:url sourceApplication:sourceApplication];
}

āĻ…āĻŦāĻļ⧇āώ⧇, FUIAuth āĻĨ⧇āϕ⧇ AuthViewController āĻāϰ āĻāĻ•āϟāĻŋ āωāĻĻāĻžāĻšāϰāĻŖ āĻĒāĻžāύāĨ¤ āϤāĻžāϰāĻĒāϰ⧇ āφāĻĒāύāĻŋ āĻāϟāĻŋāϕ⧇ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇āϰ āĻĒā§āϰāĻĨāĻŽ āĻ­āĻŋāω āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰ āĻšāĻŋāϏ⧇āĻŦ⧇ āωāĻĒāĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ āĻ…āĻĨāĻŦāĻž āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇āϰ āĻ…āĻ¨ā§āϝ āĻ­āĻŋāω āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰ āĻĨ⧇āϕ⧇ āωāĻĒāĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

āϏ⧁āχāĻĢāϟ

āϏāĻžāχāύ-āχāύ āĻĒāĻĻā§āϧāϤāĻŋ āύāĻŋāĻ°ā§āĻŦāĻžāϚāĻ• āĻĒ⧇āϤ⧇:

let authViewController = authUI.authViewController()

āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻĢā§‹āύ āύāĻŽā§āĻŦāϰ āϏāĻžāχāύ-āχāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āύ, āϤāĻžāĻšāϞ⧇ āφāĻĒāύāĻŋ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇ āϏāϰāĻžāϏāϰāĻŋ āĻĢā§‹āύ āύāĻŽā§āĻŦāϰ āϏāĻžāχāύ-āχāύ āĻ­āĻŋāω āĻĒā§āϰāĻĻāĻ°ā§āĻļāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ:

let phoneProvider = FUIAuth.defaultAuthUI().providers.first as! FUIPhoneAuth
phoneProvider.signIn(withPresenting: currentlyVisibleController, phoneNumber: nil)

āωāĻĻā§āĻĻ⧇āĻļā§āϝ-C

āϏāĻžāχāύ-āχāύ āĻĒāĻĻā§āϧāϤāĻŋ āύāĻŋāĻ°ā§āĻŦāĻžāϚāĻ• āĻĒ⧇āϤ⧇:

UINavigationController *authViewController = [authUI authViewController];

āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻĢā§‹āύ āύāĻŽā§āĻŦāϰ āϏāĻžāχāύ-āχāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āύ, āϤāĻžāĻšāϞ⧇ āφāĻĒāύāĻŋ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇ āϏāϰāĻžāϏāϰāĻŋ āĻĢā§‹āύ āύāĻŽā§āĻŦāϰ āϏāĻžāχāύ-āχāύ āĻ­āĻŋāω āĻĒā§āϰāĻĻāĻ°ā§āĻļāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ:

FUIPhoneAuth *phoneProvider = [FUIAuth defaultAuthUI].providers.firstObject;
[phoneProvider signInWithPresentingViewController:currentlyVisibleController phoneNumber:nil];

āφāĻĒāύāĻŋ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻĻ⧃āĻļā§āϝ āωāĻĒāĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāĻžāϰ āĻĒāϰ⧇ āĻāĻŦāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āϏāĻžāχāύ āχāύ āĻ•āϰāĻžāϰ āĻĒāϰ⧇, āĻĢāϞāĻžāĻĢāϞāϟāĻŋ didSignInWithUser:error: āĻĒāĻĻā§āϧāϤāĻŋāϤ⧇ FirebaseUI āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻĒā§āϰāϤāĻŋāύāĻŋāϧāĻŋāϕ⧇ āĻĢāĻŋāϰāĻŋāϝāĻŧ⧇ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāϝāĻŧ:

āϏ⧁āχāĻĢāϟ

func authUI(_ authUI: FUIAuth, didSignInWith user: FIRUser?, error: Error?) {
  // handle user and error as necessary
}

āωāĻĻā§āĻĻ⧇āĻļā§āϝ-C

   - (void)authUI:(FUIAuth *)authUI
didSignInWithUser:(nullable FIRUser *)user
            error:(nullable NSError *)error {
  // Implement this method to handle signed in user or error if any.
}

āϏāĻžāχāύ āφāωāϟ

FirebaseUI Firebase āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāϪ⧇āϰ āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āϏāĻŽāĻ¸ā§āϤ āϏāĻžāĻŽāĻžāϜāĻŋāĻ• āĻĒāϰāĻŋāϚāϝāĻŧ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀ āĻĨ⧇āϕ⧇ āϏāĻžāχāύ āφāωāϟ āĻ•āϰāĻžāϰ āϏ⧁āĻŦāĻŋāϧāĻžāϰ āĻĒāĻĻā§āϧāϤāĻŋ āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇:

āϏ⧁āχāĻĢāϟ

authUI.signOut()

āωāĻĻā§āĻĻ⧇āĻļā§āϝ-C

[authUI signOut];

āĻ•āĻžāĻ¸ā§āϟāĻŽāĻžāχāĻœā§‡āĻļāύ

āφāĻĒāύāĻŋ FirebaseUI-āĻāϰ āĻ­āĻŋāω āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰ āϏāĻžāĻŦāĻ•ā§āϞāĻžāϏ āĻ•āϰ⧇ āĻāĻŦāĻ‚ FUIAuth āĻāϰ āĻĒā§āϰāϤāĻŋāύāĻŋāϧāĻŋ āĻĒāĻĻā§āϧāϤāĻŋāϤ⧇ āϤāĻžāĻĻ⧇āϰ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āϰ⧇ āϏāĻžāχāύ-āχāύ āĻ¸ā§āĻ•ā§āϰāĻŋāύāϗ⧁āϞāĻŋ āĻ•āĻžāĻ¸ā§āϟāĻŽāĻžāχāϜ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ:

āϏ⧁āχāĻĢāϟ

func authPickerViewController(forAuthUI authUI: FUIAuth) -> FUIAuthPickerViewController {
  return FUICustomAuthPickerViewController(nibName: "FUICustomAuthPickerViewController",
                                           bundle: Bundle.main,
                                           authUI: authUI)
}

func emailEntryViewController(forAuthUI authUI: FUIAuth) -> FUIEmailEntryViewController {
  return FUICustomEmailEntryViewController(nibName: "FUICustomEmailEntryViewController",
                                           bundle: Bundle.main,
                                           authUI: authUI)
}

func passwordRecoveryViewController(forAuthUI authUI: FUIAuth, email: String) -> FUIPasswordRecoveryViewController {
  return FUICustomPasswordRecoveryViewController(nibName: "FUICustomPasswordRecoveryViewController",
                                                 bundle: Bundle.main,
                                                 authUI: authUI,
                                                 email: email)
}

func passwordSignInViewController(forAuthUI authUI: FUIAuth, email: String) -> FUIPasswordSignInViewController {
  return FUICustomPasswordSignInViewController(nibName: "FUICustomPasswordSignInViewController",
                                               bundle: Bundle.main,
                                               authUI: authUI,
                                               email: email)
}

func passwordSignUpViewController(forAuthUI authUI: FUIAuth, email: String) -> FUIPasswordSignUpViewController {
  return FUICustomPasswordSignUpViewController(nibName: "FUICustomPasswordSignUpViewController",
                                               bundle: Bundle.main,
                                               authUI: authUI,
                                               email: email)
}

func passwordVerificationViewController(forAuthUI authUI: FUIAuth, email: String, newCredential: AuthCredential) -> FUIPasswordVerificationViewController {
  return FUICustomPasswordVerificationViewController(nibName: "FUICustomPasswordVerificationViewController",
                                                     bundle: Bundle.main,
                                                     authUI: authUI,
                                                     email: email,
                                                     newCredential: newCredential)
}

āωāĻĻā§āĻĻ⧇āĻļā§āϝ-C

- (FUIAuthPickerViewController *)authPickerViewControllerForAuthUI:(FUIAuth *)authUI {
  return [[FUICustomAuthPickerViewController alloc] initWithNibName:@"FUICustomAuthPickerViewController"
                                                             bundle:[NSBundle mainBundle]
                                                             authUI:authUI];
}

- (FUIEmailEntryViewController *)emailEntryViewControllerForAuthUI:(FUIAuth *)authUI {
  return [[FUICustomEmailEntryViewController alloc] initWithNibName:@"FUICustomEmailEntryViewController"
                                                             bundle:[NSBundle mainBundle]
                                                             authUI:authUI];

}

- (FUIPasswordSignInViewController *)passwordSignInViewControllerForAuthUI:(FUIAuth *)authUI
                                                                     email:(NSString *)email {
  return [[FUICustomPasswordSignInViewController alloc] initWithNibName:@"FUICustomPasswordSignInViewController"
                                                                 bundle:[NSBundle mainBundle]
                                                                 authUI:authUI
                                                                  email:email];

}

- (FUIPasswordSignUpViewController *)passwordSignUpViewControllerForAuthUI:(FUIAuth *)authUI
                                                                     email:(NSString *)email {
  return [[FUICustomPasswordSignUpViewController alloc] initWithNibName:@"FUICustomPasswordSignUpViewController"
                                                                 bundle:[NSBundle mainBundle]
                                                                 authUI:authUI
                                                                  email:email];

}

- (FUIPasswordRecoveryViewController *)passwordRecoveryViewControllerForAuthUI:(FUIAuth *)authUI
                                                                         email:(NSString *)email {
  return [[FUICustomPasswordRecoveryViewController alloc] initWithNibName:@"FUICustomPasswordRecoveryViewController"
                                                                   bundle:[NSBundle mainBundle]
                                                                   authUI:authUI
                                                                    email:email];

}

- (FUIPasswordVerificationViewController *)passwordVerificationViewControllerForAuthUI:(FUIAuth *)authUI
                                                                                 email:(NSString *)email
                                                                         newCredential:(FIRAuthCredential *)newCredential {
  return [[FUICustomPasswordVerificationViewController alloc] initWithNibName:@"FUICustomPasswordVerificationViewController"
                                                                       bundle:[NSBundle mainBundle]
                                                                       authUI:authUI
                                                                        email:email
                                                                newCredential:newCredential];
}

āφāĻĒāύāĻŋ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇āϰ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϰ āĻļāĻ°ā§āϤāĻžāĻŦāϞ⧀āϤ⧇ URL āĻ•āĻžāĻ¸ā§āϟāĻŽāĻžāχāϜ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ, āϝāĻž āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϤ⧈āϰāĻŋāϰ āĻ¸ā§āĻ•ā§āϰāĻŋāύ⧇ āϞāĻŋāĻ™ā§āĻ• āĻ•āϰāĻž āφāϛ⧇:

āϏ⧁āχāĻĢāϟ

let kFirebaseTermsOfService = URL(string: "https://example.com/terms")!
authUI.tosurl = kFirebaseTermsOfService

āωāĻĻā§āĻĻ⧇āĻļā§āϝ-C

authUI.TOSURL = [NSURL URLWithString:@"https://example.com/terms"];

āĻ…āĻŦāĻļ⧇āώ⧇, āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ āĻ•āĻžāĻ¸ā§āϟāĻŽ āĻŦāĻžāĻ¨ā§āĻĄā§‡āϞ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āϰ⧇ āφāĻĒāύāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āĻĻ⧇āĻ–āĻžāύ⧋ āĻŦāĻžāĻ°ā§āϤāĻž āĻāĻŦāĻ‚ āĻĒā§āϰāĻŽā§āĻĒāϟāϗ⧁āϞāĻŋ āĻ•āĻžāĻ¸ā§āϟāĻŽāĻžāχāϜ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ:

āϏ⧁āχāĻĢāϟ

authUI.customStringsBundle = NSBundle.mainBundle() // Or any custom bundle.

āωāĻĻā§āĻĻ⧇āĻļā§āϝ-C

authUI.customStringsBundle = [NSBundle mainBundle]; // Or any custom bundle.

āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āĻĒāĻĻāĻ•ā§āώ⧇āĻĒ

  • FirebaseUI āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāĻŦāĻ‚ āĻ•āĻžāĻ¸ā§āϟāĻŽāĻžāχāϜ āĻ•āϰāĻžāϰ āĻŦāĻŋāώāϝāĻŧ⧇ āφāϰāĻ“ āϤāĻĨā§āϝ⧇āϰ āϜāĻ¨ā§āϝ, GitHub-āĻ README āĻĢāĻžāχāϞāϟāĻŋ āĻĻ⧇āϖ⧁āύāĨ¤
  • āφāĻĒāύāĻŋ āϝāĻĻāĻŋ FirebaseUI-āϤ⧇ āϖ⧁āρāĻœā§‡ āĻĒāĻžāύ āĻāĻŦāĻ‚ āχāĻ¸ā§āϝ⧁ āĻ•āϰ⧇āύ āĻāĻŦāĻ‚ āϰāĻŋāĻĒā§‹āĻ°ā§āϟ āĻ•āϰāϤ⧇ āϚāĻžāύ, GitHub āϏāĻŽāĻ¸ā§āϝāĻž āĻŸā§āĻ°ā§āϝāĻžāĻ•āĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤