Apple āĻĒā§āĻ˛ā§āϝāĻžāϟāĻĢāĻ°ā§āĻŽāϗ⧁āϞāĻŋāϤ⧇ Firebase āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāϪ⧇āϰ āϏāĻžāĻĨ⧇ āĻļ⧁āϰ⧁ āĻ•āϰ⧁āύ⧎

āφāĻĒāύāĻŋ Firebase Authentication āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇ āϏāĻžāχāύ āχāύ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ• āĻŦāĻž āĻāĻ•āĻžāϧāĻŋāĻ• āϏāĻžāχāύ-āχāύ āĻĒāĻĻā§āϧāϤāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇, āϝāĻžāϰ āĻŽāĻ§ā§āϝ⧇ āϰāϝāĻŧ⧇āϛ⧇ āχāĻŽā§‡āϞ āĻ āĻŋāĻ•āĻžāύāĻž āĻāĻŦāĻ‚ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āϏāĻžāχāύ-āχāύ āĻāĻŦāĻ‚ āĻĢ⧇āĻĄāĻžāϰ⧇āĻŸā§‡āĻĄ āĻĒāϰāĻŋāϚāϝāĻŧ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀ āϝ⧇āĻŽāύ Google āϏāĻžāχāύ-āχāύ āĻāĻŦāĻ‚ Facebook āϞāĻ—āχāύāĨ¤ āϕ⧀āĻ­āĻžāĻŦ⧇ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇ āχāĻŽā§‡āϞ āĻ āĻŋāĻ•āĻžāύāĻž āĻāĻŦāĻ‚ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āϏāĻžāχāύ-āχāύ āĻ•āϰāϤ⧇ āĻšāϝāĻŧ āϤāĻž āĻĻ⧇āĻ–āĻŋāϝāĻŧ⧇ āĻāχ āϟāĻŋāωāĻŸā§‹āϰāĻŋāϝāĻŧāĻžāϞ āφāĻĒāύāĻžāϕ⧇ Firebase Authentication āϏāĻžāĻĨ⧇ āĻļ⧁āϰ⧁ āĻ•āϰ⧇āĨ¤

āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒāϟāĻŋāϕ⧇ Firebase-āĻ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰ⧁āύ

  1. Firebase SDK āχāύāĻ¸ā§āϟāϞ āĻ•āϰ⧁āύ āĨ¤
  2. Firebase āĻ•āύāϏ⧋āϞ⧇ , āφāĻĒāύāĻžāϰ Firebase āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ āϝ⧋āĻ— āĻ•āϰ⧁āύāĨ¤

āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇ Firebase Authentication āϝ⧋āĻ— āĻ•āϰ⧁āύ

āĻĢāĻžāϝāĻŧāĻžāϰāĻŦ⧇āϏ āύāĻŋāĻ°ā§āĻ­āϰāϤāĻž āχāύāĻ¸ā§āϟāϞ āĻāĻŦāĻ‚ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāϤ⧇ āϏ⧁āχāĻĢāϟ āĻĒā§āϝāĻžāϕ⧇āϜ āĻŽā§āϝāĻžāύ⧇āϜāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤

  1. Xcode-āĻ, āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ āĻ–ā§‹āϞāĻžāϰ āϏāĻžāĻĨ⧇, āĻĢāĻžāχāϞ > āĻĒā§āϝāĻžāϕ⧇āϜ āϝ⧋āĻ— āĻ•āϰ⧁āύ -āĻ āύ⧇āĻ­āĻŋāϗ⧇āϟ āĻ•āϰ⧁āύāĨ¤
  2. āĻ…āύ⧁āϰ⧋āϧ āĻ•āϰāĻž āĻšāϞ⧇, Firebase Apple āĻĒā§āĻ˛ā§āϝāĻžāϟāĻĢāĻ°ā§āĻŽ SDK āϏāĻ‚āĻ—ā§āϰāĻšāĻ¸ā§āĻĨāϞ āϝ⧋āĻ— āĻ•āϰ⧁āύ:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Firebase Authentication āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āĻŦ⧇āϛ⧇ āύāĻŋāύāĨ¤
  5. āφāĻĒāύāĻžāϰ āϞāĻ•ā§āĻˇā§āϝ⧇āϰ āĻŦāĻŋāĻ˛ā§āĻĄ āϏ⧇āϟāĻŋāĻ‚āϏ⧇āϰ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āϞāĻŋāĻ™ā§āĻ•āĻžāϰ āĻĢā§āĻ˛ā§āϝāĻžāĻ— āĻŦāĻŋāĻ­āĻžāϗ⧇ -ObjC āĻĒāϤāĻžāĻ•āĻž āϝ⧋āĻ— āĻ•āϰ⧁āύāĨ¤
  6. āĻļ⧇āώ āĻšāϝāĻŧ⧇ āϗ⧇āϞ⧇, Xcode āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āĻĒāϟāĻ­ā§‚āĻŽāĻŋāϤ⧇ āφāĻĒāύāĻžāϰ āύāĻŋāĻ°ā§āĻ­āϰāϤāĻžāϗ⧁āϞāĻŋ āϏāĻŽāĻžāϧāĻžāύ āĻāĻŦāĻ‚ āĻĄāĻžāωāύāϞ⧋āĻĄ āĻ•āϰāĻž āĻļ⧁āϰ⧁ āĻ•āϰāĻŦ⧇āĨ¤

(āϐāĻšā§āĻ›āĻŋāĻ•) Firebase Local Emulator Suite āϏāĻžāĻĨ⧇ āĻĒā§āϰ⧋āĻŸā§‹āϟāĻžāχāĻĒ āĻāĻŦāĻ‚ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰ⧁āύ

āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻ•āϰ⧇ āϏ⧇ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻ•āĻĨāĻž āĻŦāϞāĻžāϰ āφāϗ⧇, āφāϏ⧁āύ Authentication āĻ•āĻžāĻ°ā§āϝāĻ•āĻžāϰāĻŋāϤāĻž āĻĒā§āϰ⧋āĻŸā§‹āϟāĻžāχāĻĒ āĻāĻŦāĻ‚ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āφāĻĒāύāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ āĻāĻŽāύ āϏāϰāĻžā§āϜāĻžāĻŽāϗ⧁āϞāĻŋāϰ āĻāĻ•āϟāĻŋ āϏ⧇āϟ āωāĻĒāĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāĻž āϝāĻžāĻ•: Firebase Local Emulator Suite āĨ¤ āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻ•ā§ŒāĻļāϞ āĻāĻŦāĻ‚ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āϏāĻŋāĻĻā§āϧāĻžāĻ¨ā§āϤ āύāĻŋāĻšā§āϛ⧇āύ, Authentication āĻāĻŦāĻ‚ Firebase Security Rules āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻĒāĻžāĻŦāϞāĻŋāĻ• āĻāĻŦāĻ‚ āĻĒā§āϰāĻžāχāϭ⧇āϟ āĻĄā§‡āϟāĻž āϏāĻš āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻĄā§‡āϟāĻž āĻŽāĻĄā§‡āϞ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰ⧇ āĻĻ⧇āϖ⧁āύ, āĻŦāĻž āϏāĻžāχāύ-āχāύ UI āĻĄāĻŋāϜāĻžāχāύ⧇āϰ āĻĒā§āϰ⧋āĻŸā§‹āϟāĻžāχāĻĒāĻŋāĻ‚, āϞāĻžāχāĻ­ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϗ⧁āϞāĻŋ āĻ¸ā§āĻĨāĻžāĻĒāύ āύāĻž āĻ•āϰ⧇ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧāĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰāϤ⧇ āϏāĻ•ā§āώāĻŽ āĻšāĻ“āϝāĻŧāĻž āĻāĻ•āϟāĻŋ āĻĻ⧁āĻ°ā§āĻĻāĻžāĻ¨ā§āϤ āϧāĻžāϰāĻŖāĻž āĻšāϤ⧇ āĻĒāĻžāϰ⧇⧎

āĻāĻ•āϟāĻŋ Authentication āĻāĻŽā§āϞ⧇āϟāϰ āĻšāϞ Local Emulator Suite āĻ…āĻ‚āĻļ, āϝāĻž āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒāϕ⧇ āĻ…āύ⧁āĻ•āϰāĻŖ āĻ•āϰāĻž āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āϏāĻžāĻŽāĻ—ā§āϰ⧀ āĻāĻŦāĻ‚ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ⧇āϰ āϏāĻžāĻĨ⧇ āχāĻ¨ā§āϟāĻžāϰāĻ…ā§āϝāĻžāĻ•ā§āϟ āĻ•āϰāϤ⧇ āϏāĻ•ā§āώāĻŽ āĻ•āϰ⧇, āϏ⧇āχāϏāĻžāĻĨ⧇ āϐāĻšā§āĻ›āĻŋāĻ•āĻ­āĻžāĻŦ⧇ āφāĻĒāύāĻžāϰ āĻ…āύ⧁āĻ•āϰāĻŖ āĻ•āϰāĻž āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ āϏāĻ‚āĻ¸ā§āĻĨāĻžāύāϗ⧁āϞāĻŋ (āĻĢāĻžāĻ‚āĻļāύ, āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ āĻāĻŦāĻ‚ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž āύāĻŋāϝāĻŧāĻŽ)āĨ¤

Authentication āĻāĻŽā§āϞ⧇āϟāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻŽāĻžāĻ¤ā§āϰ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āϧāĻžāĻĒ āϜāĻĄāĻŧāĻŋāϤ:

  1. āĻāĻŽā§āϞ⧇āϟāϰ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧋āĻ— āĻ•āϰāϤ⧇ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇āϰ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇ āϕ⧋āĻĄā§‡āϰ āĻāĻ•āϟāĻŋ āϞāĻžāχāύ āϝ⧋āĻ— āĻ•āϰāĻž āĻšāĻšā§āϛ⧇āĨ¤
  2. āφāĻĒāύāĻžāϰ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧ āĻĒā§āϰāĻœā§‡āĻ•ā§āϟ āĻĄāĻŋāϰ⧇āĻ•ā§āϟāϰāĻŋāϰ āϰ⧁āϟ āĻĨ⧇āϕ⧇, firebase emulators:start āĨ¤
  3. āχāĻ¨ā§āϟāĻžāϰ⧇āĻ•ā§āϟāĻŋāĻ­ āĻĒā§āϰ⧋āĻŸā§‹āϟāĻžāχāĻĒāĻŋāĻ‚āϝāĻŧ⧇āϰ āϜāĻ¨ā§āϝ 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;
  // ...
}

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

āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻĒāϰāĻŋāϚāϝāĻŧ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀ āĻāĻŦāĻ‚ āĻŦ⧇āύāĻžāĻŽā§€ āĻ…āϤāĻŋāĻĨāĻŋ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āϕ⧀āĻ­āĻžāĻŦ⧇ āϏāĻŽāĻ°ā§āĻĨāύ āϝ⧋āĻ— āĻ•āϰāĻŦ⧇āύ āϤāĻž āϜāĻžāύ⧁āύ: