āĻ…ā§āϝāĻžāĻĒāϞ āĻāĻŦāĻ‚ āχāωāύāĻŋāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻ•āϰ⧁āύ

āĻāĻ¨ā§āĻĄ-āϟ⧁-āĻāĻ¨ā§āĻĄ OAuth 2.0 āϏāĻžāχāύ-āχāύ āĻĢā§āϞ⧋ āϚāĻžāϞāĻžāύ⧋āϰ āϜāĻ¨ā§āϝ āφāĻĒāύāĻŋ Firebase SDK āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āφāĻĒāύāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āϤāĻžāĻĻ⧇āϰ Apple ID āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ Firebase-āĻāϰ āϏāĻžāĻĨ⧇ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻ•āϰāϤ⧇ āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

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

Apple āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āϏāĻžāχāύ āχāύ āĻ•āϰāϤ⧇, āĻĒā§āϰāĻĨāĻŽā§‡ Apple āĻāϰ āĻŦāĻŋāĻ•āĻžāĻļāĻ•āĻžāϰ⧀ āϏāĻžāχāĻŸā§‡ Apple āĻāϰ āϏāĻžāĻĨ⧇ āϏāĻžāχāύ āχāύ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰ⧁āύ, āϤāĻžāϰāĻĒāϰ āφāĻĒāύāĻžāϰ Firebase āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āϏāĻžāχāύ-āχāύ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀ āĻšāĻŋāϏāĻžāĻŦ⧇ Apple āϏāĻ•ā§āώāĻŽ āĻ•āϰ⧁āύ⧎

āĻ…ā§āϝāĻžāĻĒāϞ āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡ āϝ⧋āĻ— āĻĻāĻŋāύ

Apple āĻāϰ āϏāĻžāĻĨ⧇ āϏāĻžāχāύ āχāύ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ Apple āĻŦāĻŋāĻ•āĻžāĻļāĻ•āĻžāϰ⧀ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡āϰ āϏāĻĻāĻ¸ā§āϝāĻĻ⧇āϰ āĻĻā§āĻŦāĻžāϰāĻž āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇⧎

āĻ…ā§āϝāĻžāĻĒāϞ āĻĻāĻŋāϝāĻŧ⧇ āϏāĻžāχāύ āχāύ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰ⧁āύ

āφāĻĒāύāĻžāϰ āĻĢāĻžāϝāĻŧāĻžāϰāĻŦ⧇āϏ āĻĒā§āϰāĻœā§‡āĻ•ā§āĻŸā§‡ Apple āϏāĻžāχāύ āχāύ āĻ…āĻŦāĻļā§āϝāχ āϏāĻ•ā§āώāĻŽ āĻāĻŦāĻ‚ āϏāĻ āĻŋāĻ•āĻ­āĻžāĻŦ⧇ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰāĻž āφāĻŦāĻļā§āϝāĻ•āĨ¤ āĻ…ā§āϝāĻžāĻĒāϞ āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻ…ā§āϝāĻžāĻ¨ā§āĻĄā§āϰāϝāĻŧ⧇āĻĄ āĻāĻŦāĻ‚ āĻ…ā§āϝāĻžāĻĒāϞ āĻĒā§āĻ˛ā§āϝāĻžāϟāĻĢāĻ°ā§āĻŽ āϜ⧁āĻĄāĻŧ⧇ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāĻŋāϤ āĻšāϝāĻŧāĨ¤ āĻ…āύ⧁āĻ—ā§āϰāĻš āĻ•āϰ⧇ āĻāĻ—āĻŋāϝāĻŧ⧇ āϝāĻžāĻ“āϝāĻŧāĻžāϰ āφāϗ⧇ iOS+ āĻāĻŦāĻ‚/āĻ…āĻĨāĻŦāĻž āĻ…ā§āϝāĻžāĻ¨ā§āĻĄā§āϰāϝāĻŧ⧇āĻĄ āĻ—āĻžāχāĻĄā§‡āϰ "āĻ…ā§āϝāĻžāĻĒāϞ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻžāχāύ āχāύ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰ⧁āύ" āĻŦāĻŋāĻ­āĻžāĻ—āϟāĻŋ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰ⧁āύ⧎

āĻāĻ•āϟāĻŋ āϏāĻžāχāύ-āχāύ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀ āĻšāĻŋāϏāĻžāĻŦ⧇ Apple āϏāĻ•ā§āώāĻŽ āĻ•āϰ⧁āύ⧎

  1. Firebase āĻ•āύāϏ⧋āϞ⧇ , Auth āĻŦāĻŋāĻ­āĻžāĻ—āϟāĻŋ āϖ⧁āϞ⧁āύāĨ¤ āϏāĻžāχāύ āχāύ āĻĒāĻĻā§āϧāϤāĻŋ āĻŸā§āϝāĻžāĻŦ⧇, āĻ…ā§āϝāĻžāĻĒāϞ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀ āϏāĻ•ā§āώāĻŽ āĻ•āϰ⧁āύāĨ¤
  2. āĻ…ā§āϝāĻžāĻĒāϞ āϏāĻžāχāύ āχāύ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀ āϏ⧇āϟāĻŋāĻ‚āϏ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰ⧁āύ:
    1. āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻ…ā§āϝāĻžāĻĒāϞ āĻĒā§āĻ˛ā§āϝāĻžāϟāĻĢāĻ°ā§āĻŽā§‡ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰ⧇āύ, āϤāĻžāĻšāϞ⧇ āφāĻĒāύāĻŋ āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āφāχāĻĄāĻŋ, āĻ…ā§āϝāĻžāĻĒāϞ āϟāĻŋāĻŽ āφāχāĻĄāĻŋ, āĻĒā§āϰāĻžāχāϭ⧇āϟ āϕ⧀ āĻāĻŦāĻ‚ āϕ⧀ āφāχāĻĄāĻŋ āĻ•ā§āώ⧇āĻ¤ā§āϰāϗ⧁āϞāĻŋ āĻ–āĻžāϞāĻŋ āϰāĻžāĻ–āϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤
    2. āĻ…ā§āϝāĻžāĻ¨ā§āĻĄā§āϰāϝāĻŧ⧇āĻĄ āĻĄāĻŋāĻ­āĻžāχāϏ⧇ āϏāĻŽāĻ°ā§āĻĨāύ⧇āϰ āϜāĻ¨ā§āϝ:
      1. āφāĻĒāύāĻžāϰ Android āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇ Firebase āϝ⧋āĻ— āĻ•āϰ⧁āύ āĨ¤ Firebase āĻ•āύāϏ⧋āϞ⧇ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ āϏ⧇āϟ āφāĻĒ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇āϰ SHA-1 āĻ¸ā§āĻŦāĻžāĻ•ā§āώāϰ āύāĻŋāĻŦāĻ¨ā§āϧāύ āĻ•āϰāϤ⧇ āϭ⧁āϞāĻŦ⧇āύ āύāĻžāĨ¤
      2. Firebase āĻ•āύāϏ⧋āϞ⧇ , Auth āĻŦāĻŋāĻ­āĻžāĻ—āϟāĻŋ āϖ⧁āϞ⧁āύāĨ¤ āϏāĻžāχāύ āχāύ āĻĒāĻĻā§āϧāϤāĻŋ āĻŸā§āϝāĻžāĻŦ⧇, āĻ…ā§āϝāĻžāĻĒāϞ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀ āϏāĻ•ā§āώāĻŽ āĻ•āϰ⧁āύāĨ¤ āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āĻŦāĻŋāĻ­āĻžāϗ⧇ āφāĻĒāύāĻŋ āϝ⧇ āĻĒāϰāĻŋāώ⧇āĻŦāĻž āφāχāĻĄāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰ⧇āϛ⧇āύ āϤāĻž āωāĻ˛ā§āϞ⧇āĻ– āĻ•āϰ⧁āύāĨ¤ āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“, OAuth āϕ⧋āĻĄ āĻĢā§āϞ⧋ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻŦāĻŋāĻ­āĻžāϗ⧇, āφāĻĒāύāĻžāϰ Apple āϟāĻŋāĻŽ āφāχāĻĄāĻŋ āĻāĻŦāĻ‚ āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āĻŦāĻŋāĻ­āĻžāϗ⧇ āφāĻĒāύāĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻŦā§āϝāĻ•ā§āϤāĻŋāĻ—āϤ āϕ⧀ āĻāĻŦāĻ‚ āϕ⧀ āφāχāĻĄāĻŋ āωāĻ˛ā§āϞ⧇āĻ– āĻ•āϰ⧁āύāĨ¤

āĻ…ā§āϝāĻžāĻĒāϞ āĻŦ⧇āύāĻžāĻŽā§€ āĻĄā§‡āϟāĻž āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧāϤāĻž āĻŽā§‡āύ⧇ āϚāϞ⧁āύ

āĻ…ā§āϝāĻžāĻĒāϞ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻžāχāύ āχāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āϏāĻžāχāύ āχāύ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āϤāĻžāĻĻ⧇āϰ āχāĻŽā§‡āϞ āĻ āĻŋāĻ•āĻžāύāĻž āϏāĻš āϤāĻžāĻĻ⧇āϰ āĻĄā§‡āϟāĻž āĻŦ⧇āύāĻžāĻŽā§€ āĻ•āϰāĻžāϰ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻĻ⧇āϝāĻŧ⧎ āϝ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰāĻž āĻāχ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāϟāĻŋ āĻŦ⧇āϛ⧇ āύ⧇āύ āϤāĻžāĻĻ⧇āϰ āĻ•āĻžāϛ⧇ privaterelay.appleid.com āĻĄā§‹āĻŽā§‡āύ⧇āϰ āχāĻŽā§‡āϞ āĻ āĻŋāĻ•āĻžāύāĻž āϰāϝāĻŧ⧇āϛ⧇⧎ āφāĻĒāύāĻŋ āϝāĻ–āύ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇ Apple āĻāϰ āϏāĻžāĻĨ⧇ āϏāĻžāχāύ āχāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āύ, āϤāĻ–āύ āφāĻĒāύāĻžāϕ⧇ āĻ…āĻŦāĻļā§āϝāχ āĻāχ āĻŦ⧇āύāĻžāĻŽā§€ Apple ID āϏāĻ‚āĻ•ā§āϰāĻžāĻ¨ā§āϤ āϝ⧇āϕ⧋āύ āĻĒā§āϰāϝ⧋āĻœā§āϝ āĻŦāĻŋāĻ•āĻžāĻļāĻ•āĻžāϰ⧀ āύ⧀āϤāĻŋ āĻŦāĻž Apple āĻĨ⧇āϕ⧇ āĻļāĻ°ā§āϤāĻžāĻŦāϞ⧀ āĻŽā§‡āύ⧇ āϚāϞāϤ⧇ āĻšāĻŦ⧇āĨ¤

āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ āĻŦ⧇āύāĻžāĻŽā§€ āĻ…ā§āϝāĻžāĻĒāϞ āφāχāĻĄāĻŋāϰ āϏāĻžāĻĨ⧇ āϏāϰāĻžāϏāϰāĻŋ āϏāύāĻžāĻ•ā§āϤāĻ•āĻžāϰ⧀ āĻŦā§āϝāĻ•ā§āϤāĻŋāĻ—āϤ āϤāĻĨā§āϝ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāĻžāϰ āφāϗ⧇ āϝ⧇āϕ⧋āύ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āϏāĻŽā§āĻŽāϤāĻŋ āĻĒā§āϰāĻžāĻĒā§āϤ āĻ•āϰāĻž āĻāϰ āĻŽāĻ§ā§āϝ⧇ āϰāϝāĻŧ⧇āϛ⧇āĨ¤ āĻĢāĻžāϝāĻŧāĻžāϰāĻŦ⧇āϏ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ, āĻāϤ⧇ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻ•ā§āϰāĻŋāϝāĻŧāĻžāϗ⧁āϞāĻŋ āĻ…āĻ¨ā§āϤāĻ°ā§āϭ⧁āĻ•ā§āϤ āĻĨāĻžāĻ•āϤ⧇ āĻĒāĻžāϰ⧇:

  • āĻāĻ•āϟāĻŋ āĻŦ⧇āύāĻžāĻŽā§€ āĻ…ā§āϝāĻžāĻĒāϞ āφāχāĻĄāĻŋ āĻŦāĻž āĻŦāĻŋāĻĒāϰ⧀āϤ⧇ āĻāĻ•āϟāĻŋ āχāĻŽā§‡āϞ āĻ āĻŋāĻ•āĻžāύāĻž āϞāĻŋāĻ™ā§āĻ• āĻ•āϰ⧁āύ.
  • āĻāĻ•āϟāĻŋ āĻŦ⧇āύāĻžāĻŽā§€ āĻ…ā§āϝāĻžāĻĒāϞ āφāχāĻĄāĻŋāϤ⧇ āĻāĻ•āϟāĻŋ āĻĢā§‹āύ āύāĻŽā§āĻŦāϰ āϞāĻŋāĻ™ā§āĻ• āĻ•āϰ⧁āύ āĻŦāĻž āĻāϰ āĻŦāĻŋāĻĒāϰ⧀āϤ⧇
  • āĻāĻ•āϟāĻŋ āĻŦ⧇āύāĻžāĻŽā§€ āϏāĻžāĻŽāĻžāϜāĻŋāĻ• āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰ (āĻĢ⧇āϏāĻŦ⧁āĻ•, āϗ⧁āĻ—āϞ, āχāĻ¤ā§āϝāĻžāĻĻāĻŋ) āĻāĻ•āϟāĻŋ āĻŦ⧇āύāĻžāĻŽā§€ āĻ…ā§āϝāĻžāĻĒāϞ āφāχāĻĄāĻŋāϤ⧇ āĻŦāĻž āĻāϰ āĻŦāĻŋāĻĒāϰ⧀āϤ⧇ āϞāĻŋāĻ™ā§āĻ• āĻ•āϰ⧁āύ⧎

āωāĻĒāϰ⧇āϰ āϤāĻžāϞāĻŋāĻ•āĻžāϟāĻŋ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āύāϝāĻŧāĨ¤ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ āĻ…ā§āϝāĻžāĻĒāϞ⧇āϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧāϤāĻž āĻĒā§‚āϰāĻŖ āĻ•āϰāϛ⧇ āϤāĻž āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāϤ⧇ āφāĻĒāύāĻžāϰ āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āĻŸā§‡āϰ āϏāĻĻāĻ¸ā§āϝāĻĒāĻĻ āĻŦāĻŋāĻ­āĻžāϗ⧇ āĻ…ā§āϝāĻžāĻĒāϞ āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āϞāĻžāχāϏ⧇āĻ¨ā§āϏ āϚ⧁āĻ•ā§āϤāĻŋ āĻĒāĻĄāĻŧ⧁āύāĨ¤

Firebase.Auth.FirebaseAuth āĻ•ā§āϞāĻžāϏ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻ•āϰ⧁āύ

FirebaseAuth āĻ•ā§āϞāĻžāϏ āĻšāϞ āϏāĻŽāĻ¸ā§āϤ API āĻ•āϞ⧇āϰ āϗ⧇āϟāĻ“āϝāĻŧ⧇āĨ¤ āĻāϟāĻŋ FirebaseAuth.DefaultInstance āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏāϝ⧋āĻ—ā§āϝāĨ¤
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;

Firebase SDK āĻĻāĻŋāϝāĻŧ⧇ āϏāĻžāχāύ-āχāύ āĻĢā§āϞ⧋ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰ⧁āύ

āĻ…ā§āϝāĻžāĻĒāϞ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻžāχāύ-āχāύ āĻ•āϰāĻžāϰ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻž Apple āĻāĻŦāĻ‚ Android āĻĒā§āĻ˛ā§āϝāĻžāϟāĻĢāĻ°ā§āĻŽ āϜ⧁āĻĄāĻŧ⧇ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāĻŋāϤ āĻšāϝāĻŧāĨ¤

āĻ…ā§āϝāĻžāĻĒāϞ āĻĒā§āĻ˛ā§āϝāĻžāϟāĻĢāĻ°ā§āĻŽā§‡

  1. āĻ…ā§āϝāĻžāĻĒāϞ āϏāĻžāχāύ āχāύ āύāύāϏ āĻāĻŦāĻ‚ āĻŸā§‹āϕ⧇āύ āĻœā§‡āύāĻžāϰ⧇āĻļāύ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāϤ⧇ āĻāĻ•āϟāĻŋ āϤ⧃āϤ⧀āϝāĻŧ āĻĒāĻ•ā§āώ⧇āϰ āĻĒā§āϞāĻžāĻ—āχāύ āχāύāĻ¸ā§āϟāϞ āĻ•āϰ⧁āύ, āϝ⧇āĻŽāύ Apple āĻ…ā§āϝāĻžāϏ⧇āϟ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ āĻĒā§āϝāĻžāϕ⧇āĻœā§‡āϰ āϏāĻžāĻĨ⧇ āχāωāύāĻŋāϟāĻŋāϰ āϏāĻžāχāύ āχāύ āĨ¤ āĻĢāĻžāϝāĻŧāĻžāϰāĻŦ⧇āϏ āĻ…āĻĒāĻžāϰ⧇āĻļāύ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ⧇āϰ āϜāĻ¨ā§āϝ āĻœā§‡āύāĻžāϰ⧇āϟ āĻ•āϰāĻž āĻ°ā§āϝāĻžāĻ¨ā§āĻĄāĻŽ āύāύāϏ āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚āϟāĻŋāϕ⧇ āϤāĻžāϰ āĻ•āĻžāρāϚāĻž āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāϝāĻŧ āĻĒā§āϞāĻžāĻŽā§āĻŦ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āφāĻĒāύāĻžāϕ⧇ āϕ⧋āĻĄāϟāĻŋ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāϤ⧇ āĻšāϤ⧇ āĻĒāĻžāϰ⧇ (āĻ…āĻ°ā§āĻĨāĻžā§Ž, āύāύāϏ⧇āϰ SHA256 āĻĄāĻžāχāĻœā§‡āĻ¸ā§āϟ āĻĢāĻ°ā§āĻŽ āϤ⧈āϰāĻŋ āĻšāĻ“āϝāĻŧāĻžāϰ āφāϗ⧇ āĻāϟāĻŋāϰ āĻāĻ•āϟāĻŋ āĻ…āύ⧁āϞāĻŋāĻĒāĻŋ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧁āύ)āĨ¤

  2. āĻāĻ•āϟāĻŋ Firebase āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻāĻŦāĻ‚ Firebase-āĻ āϏāĻžāχāύ āχāύ āĻ•āϰāϤ⧇ āĻĢāϞāĻ¸ā§āĻŦāϰ⧂āĻĒ āĻŸā§‹āϕ⧇āύ āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚ āĻāĻŦāĻ‚ āĻ•āĻžāρāϚāĻž āύāύāϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤

    Firebase.Auth.Credential credential =
        Firebase.Auth.OAuthProvider.GetCredential("apple.com", appleIdToken, rawNonce, null);
    auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsCanceled) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync was canceled.");
        return;
      }
      if (task.IsFaulted) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync encountered an error: " + task.Exception);
        return;
      }
    
      Firebase.Auth.AuthResult result = task.Result;
      Debug.LogFormat("User signed in successfully: {0} ({1})",
          result.User.DisplayName, result.User.UserId);
    });

  3. āĻāĻ•āχ āĻĒā§āϝāĻžāϟāĻžāĻ°ā§āύ ReauthenticateAsync āĻāϰ āϏāĻžāĻĨ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇ āϝāĻž āϏāĻžāĻŽā§āĻĒā§āϰāϤāĻŋāĻ• āϞāĻ—āχāύ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻāĻŽāύ āϏāĻ‚āĻŦ⧇āĻĻāύāĻļā§€āϞ āĻ…āĻĒāĻžāϰ⧇āĻļāύāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āύāϤ⧁āύ āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰāϤ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āφāϰāĻ“ āϤāĻĨā§āϝ⧇āϰ āϜāĻ¨ā§āϝ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻĻ⧇āϖ⧁āύāĨ¤

  4. Apple āĻĒā§āĻ˛ā§āϝāĻžāϟāĻĢāĻ°ā§āĻŽāϗ⧁āϞāĻŋāϤ⧇ Apple āϏāĻžāχāύ āχāύ⧇āϰ āϏāĻžāĻĨ⧇ āϞāĻŋāĻ™ā§āĻ• āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ āĻ¤ā§āϰ⧁āϟāĻŋāϰ āϏāĻŽā§āĻŽā§āĻ–ā§€āύ āĻšāϤ⧇ āĻĒāĻžāϰ⧇āύ āϝ⧇ āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ Firebase āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇ Apple āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āĻŸā§‡āϰ āϏāĻžāĻĨ⧇ āϞāĻŋāĻ™ā§āĻ• āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇⧎ āϝāĻ–āύ āĻāϟāĻŋ āϘāĻŸā§‡ āϤāĻ–āύ āĻāĻ•āϟāĻŋ Firebase.Auth.FirebaseAccountLinkException āĻ¸ā§āĻŸā§āϝāĻžāĻ¨ā§āĻĄāĻžāĻ°ā§āĻĄ Firebase.FirebaseException āĻāϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇ āύāĻŋāĻ•ā§āώ⧇āĻĒ āĻ•āϰāĻž āĻšāĻŦ⧇āĨ¤ āĻāχ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āĻŦā§āϝāϤāĻŋāĻ•ā§āϰāĻŽāϟāĻŋāϤ⧇ āĻāĻ•āϟāĻŋ UserInfo.UpdatedCredential āĻĒā§āϰāĻĒāĻžāĻ°ā§āϟāĻŋ āϰāϝāĻŧ⧇āϛ⧇ āϝāĻž āĻŦ⧈āϧ āĻšāϞ⧇ FirebaseAuth.SignInAndRetrieveDataWithCredentialAsync āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻ…ā§āϝāĻžāĻĒāϞ-āϞāĻŋāĻ™ā§āĻ• āĻ•āϰāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇ āϏāĻžāχāύ-āχāύ āĻ•āϰāϤ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āφāĻĒāĻĄā§‡āϟ āĻšāĻ“āϝāĻŧāĻž āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰāϟāĻŋ āϏāĻžāχāύ-āχāύ āĻ…āĻĒāĻžāϰ⧇āĻļāύ⧇āϰ āϜāĻ¨ā§āϝ āύāϤ⧁āύ āĻ…ā§āϝāĻžāĻĒāϞ āϏāĻžāχāύ-āχāύ āĻŸā§‹āϕ⧇āύ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧāϤāĻžāϕ⧇ āĻŦāĻžāϧāĻž āĻĻ⧇āϝāĻŧāĨ¤

    auth.CurrentUser.LinkWithCredentialAsync(
      Firebase.Auth.OAuthProvider.GetCredential("apple.com", idToken, rawNonce, null))
        .ContinueWithOnMainThread( task => {
          if (task.IsCompletedSuccessfully) {
            // Link Success
          } else {
            if (task.Exception != null) {
              foreach (Exception exception in task.Exception.Flatten().InnerExceptions) {
                Firebase.Auth.FirebaseAccountLinkException firebaseEx =
                  exception as Firebase.Auth.FirebaseAccountLinkException;
                if (firebaseEx != null && firebaseEx.UserInfo.UpdatedCredential.IsValid()) {
                  // Attempt to sign in with the updated credential.
                  auth.SignInAndRetrieveDataWithCredentialAsync(firebaseEx.UserInfo.UpdatedCredential).
                    ContinueWithOnMainThread( authResultTask => {
                      // Handle Auth result.
                    });
                } else {
                  Debug.Log("Link with Apple failed:" + firebaseEx );
                }
              } // end for loop
            }
          }
        });

āĻ…ā§āϝāĻžāĻ¨ā§āĻĄā§āϰāϝāĻŧ⧇āĻĄā§‡

āĻ…ā§āϝāĻžāĻ¨ā§āĻĄā§āϰāϝāĻŧ⧇āĻĄā§‡, āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇ āĻ“āϝāĻŧ⧇āĻŦ-āĻ­āĻŋāĻ¤ā§āϤāĻŋāĻ• āĻœā§‡āύ⧇āϰāĻŋāĻ• OAuth āϞāĻ—āχāύāϕ⧇ āĻāϕ⧀āĻ­ā§‚āϤ āĻ•āϰ⧇ Firebase-āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āφāĻĒāύāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻ•āϰ⧁āύ Firebase SDK āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϏāĻžāχāύ-āχāύ āĻĢā§āϞ⧋ āĻļ⧇āώ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝāĨ¤

Firebase SDK-āĻāϰ āϏāĻžāĻĨ⧇ āϏāĻžāχāύ-āχāύ āĻĒā§āϰāĻŦāĻžāĻš āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāϤ⧇, āĻāχ āϧāĻžāĻĒāϗ⧁āϞāĻŋ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰ⧁āύ:

  1. Apple-āĻāϰ āϜāĻ¨ā§āϝ āωāĻĒāϝ⧁āĻ•ā§āϤ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀ āφāχāĻĄāĻŋ āĻĻāĻŋāϝāĻŧ⧇ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰāĻž FederatedOAuthProviderData āĻāϰ āĻāĻ•āϟāĻŋ āωāĻĻāĻžāĻšāϰāĻŖ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύāĨ¤

    Firebase.Auth.FederatedOAuthProviderData providerData =
      new Firebase.Auth.FederatedOAuthProviderData();
    
    providerData.ProviderId = "apple.com";
    
  2. āϐāĻšā§āĻ›āĻŋāĻ•: āĻĄāĻŋāĻĢāĻ˛ā§āĻŸā§‡āϰ āĻŦāĻžāχāϰ⧇ āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ OAuth 2.0 āĻ¸ā§āϕ⧋āĻĒ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āϰ⧁āύ āϝāĻž āφāĻĒāύāĻŋ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀āϰ āĻ•āĻžāĻ› āĻĨ⧇āϕ⧇ āĻ…āύ⧁āϰ⧋āϧ āĻ•āϰāϤ⧇ āϚāĻžāύāĨ¤

    providerData.Scopes = new List<string>();
    providerData.Scopes.Add("email");
    providerData.Scopes.Add("name");
    
  3. āϐāĻšā§āĻ›āĻŋāĻ•: āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āχāĻ‚āϰ⧇āϜāĻŋ āĻ›āĻžāĻĄāĻŧāĻž āĻ…āĻ¨ā§āϝ āϕ⧋āύ⧋ āĻ­āĻžāώāĻžāϝāĻŧ Apple-āĻāϰ āϏāĻžāχāύ-āχāύ āĻ¸ā§āĻ•ā§āϰ⧀āύ āĻĒā§āϰāĻĻāĻ°ā§āĻļāύ āĻ•āϰāϤ⧇ āϚāĻžāύ, āϤāĻžāĻšāϞ⧇ locale āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ āϏ⧇āϟ āĻ•āϰ⧁āύāĨ¤ āϏāĻŽāĻ°ā§āĻĨāĻŋāϤ āϞ⧋āϕ⧇āϞ⧇āϰ āϜāĻ¨ā§āϝ āĻ…ā§āϝāĻžāĻĒāϞ āĻĄāĻ•ā§āϏ āĻĻāĻŋāϝāĻŧ⧇ āϏāĻžāχāύ āχāύ āĻĻ⧇āϖ⧁āύāĨ¤

    providerData.CustomParameters = new Dictionary<string,string>;
    
    // Localize to French.
    providerData.CustomParameters.Add("language", "fr");
    
  4. āĻāĻ•āĻŦāĻžāϰ āφāĻĒāύāĻžāϰ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀āϰ āĻĄā§‡āϟāĻž āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻšāϝāĻŧ⧇ āϗ⧇āϞ⧇, āĻāĻ•āϟāĻŋ FederatedOAuthProvider āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤

    // Construct a FederatedOAuthProvider for use in Auth methods.
    Firebase.Auth.FederatedOAuthProvider provider =
      new Firebase.Auth.FederatedOAuthProvider();
    provider.SetProviderData(providerData);
    
  5. Auth āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀ āĻŦāĻ¸ā§āϤ⧁ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ Firebase āĻĻāĻŋāϝāĻŧ⧇ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻ•āϰ⧁āύāĨ¤ āĻŽāύ⧇ āϰāĻžāĻ–āĻŦ⧇āύ āϝ⧇ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ FirebaseAuth āĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϞāĻžāĻĒāϗ⧁āϞāĻŋāϰ āĻŦāĻŋāĻĒāϰ⧀āϤ⧇, āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āĻ“āϝāĻŧ⧇āĻŦ āĻ­āĻŋāω āĻĒāĻĒ āφāĻĒ āĻ•āϰ⧇ āφāĻĒāύāĻžāϰ UI āύāĻŋāϝāĻŧāĻ¨ā§āĻ¤ā§āϰāĻŖ āĻ•āϰāĻŦ⧇ āϝ⧇āĻ–āĻžāύ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āϤāĻžāĻĻ⧇āϰ āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰāϗ⧁āϞāĻŋ āĻĒā§āϰāĻŦ⧇āĻļ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇⧎

    āϏāĻžāχāύ āχāύ āĻĢā§āϞ⧋ āĻļ⧁āϰ⧁ āĻ•āϰāϤ⧇, signInWithProvider āĻ•āϞ āĻ•āϰ⧁āύ:

    auth.SignInWithProviderAsync(provider).ContinueOnMainThread(task => {
        if (task.IsCanceled) {
            Debug.LogError("SignInWithProviderAsync was canceled.");
            return;
        }
        if (task.IsFaulted) {
            Debug.LogError("SignInWithProviderAsync encountered an error: " +
              task.Exception);
            return;
        }
    
        Firebase.Auth.AuthResult authResult = task.Result;
        Firebase.Auth.FirebaseUser user = authResult.User;
        Debug.LogFormat("User signed in successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    
  6. āĻāĻ•āχ āĻĒā§āϝāĻžāϟāĻžāĻ°ā§āύ ReauthenticateWithProvider āϏāĻžāĻĨ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇ āϝāĻž āϏāĻžāĻŽā§āĻĒā§āϰāϤāĻŋāĻ• āϞāĻ—āχāύ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻāĻŽāύ āϏāĻ‚āĻŦ⧇āĻĻāύāĻļā§€āϞ āĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϞāĻžāĻĒ⧇āϰ āϜāĻ¨ā§āϝ āύāϤ⧁āύ āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰāϤ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

    user.ReauthenticateWithProviderAsync(provider).ContinueOnMainThread(task => {
        if (task.IsCanceled) {
            Debug.LogError("ReauthenticateWithProviderAsync was canceled.");
            return;
        }
        if (task.IsFaulted) {
            Debug.LogError(
            "ReauthenticateWithProviderAsync encountered an error: " +
                task.Exception);
            return;
        }
    
        Firebase.Auth.AuthResult authResult = task.Result;
        Firebase.Auth.FirebaseUser user = authResult.User;
        Debug.LogFormat("User reauthenticated successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    
  7. āĻāĻŦāĻ‚, āφāĻĒāύāĻŋ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āĻŸā§‡ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻĒāϰāĻŋāϚāϝāĻŧ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀āϕ⧇ āϞāĻŋāĻ™ā§āĻ• āĻ•āϰāϤ⧇ LinkWithCredentialAsync() āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

    āĻŽāύ⧇ āϰāĻžāĻ–āĻŦ⧇āύ āϝ⧇ āĻ…ā§āϝāĻžāĻĒāϞ āφāĻĒāύāĻžāϕ⧇ āϤāĻžāĻĻ⧇āϰ āĻ…ā§āϝāĻžāĻĒāϞ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟāϗ⧁āϞāĻŋāϕ⧇ āĻ…āĻ¨ā§āϝ āĻĄā§‡āϟāĻžāϰ āϏāĻžāĻĨ⧇ āϞāĻŋāĻ™ā§āĻ• āĻ•āϰāĻžāϰ āφāϗ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āĻ•āĻžāĻ› āĻĨ⧇āϕ⧇ āĻ¸ā§āĻĒāĻˇā§āϟ āϏāĻŽā§āĻŽāϤāĻŋ āύāĻŋāϤ⧇ āĻšāĻŦ⧇āĨ¤

    āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āĻŦāĻ°ā§āϤāĻŽāĻžāύ āĻĢāĻžāϝāĻŧāĻžāϰāĻŦ⧇āϏ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āĻŸā§‡āϰ āϏāĻžāĻĨ⧇ āĻāĻ•āϟāĻŋ Facebook āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϞāĻŋāĻ™ā§āĻ• āĻ•āϰāϤ⧇, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇ Facebook-āĻ āϏāĻžāχāύ āχāύ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āφāĻĒāύāĻŋ āϝ⧇ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻŸā§‹āϕ⧇āύ āĻĒ⧇āϝāĻŧ⧇āϛ⧇āύ āϤāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ:

    // Initialize a Facebook credential with a Facebook access token.
    
    Firebase.Auth.Credential credential =
        Firebase.Auth.FacebookAuthProvider.GetCredential(facebook_token);
    
    // Assuming the current user is an Apple user linking a Facebook provider.
    user.LinkWithCredentialAsync(credential)
        .ContinueWithOnMainThread( task => {
          if (task.IsCanceled) {
              Debug.LogError("LinkWithCredentialAsync was canceled.");
              return;
          }
          if (task.IsFaulted) {
            Debug.LogError("LinkWithCredentialAsync encountered an error: "
                           + task.Exception);
              return;
          }
    
          Firebase.Auth.AuthResult result = task.Result;
          Firebase.Auth.FirebaseUser user = result.User;
          Debug.LogFormat("User linked successfully: {0} ({1})",
              user.DisplayName, user.UserId);
        });
    

Apple Notes āĻĻāĻŋāϝāĻŧ⧇ āϏāĻžāχāύ āχāύ āĻ•āϰ⧁āύ

Firebase Auth āĻĻā§āĻŦāĻžāϰāĻž āϏāĻŽāĻ°ā§āĻĨāĻŋāϤ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āĻĨ⧇āϕ⧇ āĻ­āĻŋāĻ¨ā§āύ, Apple āĻāĻ•āϟāĻŋ āĻĢāĻŸā§‹ URL āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇ āύāĻžāĨ¤

āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āϝāĻ–āύ āĻ…ā§āϝāĻžāĻĒ⧇āϰ āϏāĻžāĻĨ⧇ āϤāĻžāĻĻ⧇āϰ āχāĻŽā§‡āϞ āĻļ⧇āϝāĻŧāĻžāϰ āύāĻž āĻ•āϰāĻž āĻŦ⧇āϛ⧇ āύ⧇āϝāĻŧ, āϤāĻ–āύ āĻ…ā§āϝāĻžāĻĒāϞ āϏ⧇āχ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻ…āύāĻ¨ā§āϝ āχāĻŽā§‡āϞ āĻ āĻŋāĻ•āĻžāύāĻžāϰ āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻž āĻ•āϰ⧇ (āĻĢāĻ°ā§āĻŽ xyz@privaterelay.appleid.com ), āϝāĻž āĻāϟāĻŋ āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇āϰ āϏāĻžāĻĨ⧇ āĻļ⧇āϝāĻŧāĻžāϰ āĻ•āϰ⧇āĨ¤ āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻŦā§āϝāĻ•ā§āϤāĻŋāĻ—āϤ āχāĻŽā§‡āϞ āϰāĻŋāϞ⧇ āĻĒāϰāĻŋāώ⧇āĻŦāĻž āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻ•āϰ⧇āύ, āĻ…ā§āϝāĻžāĻĒāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āφāϏāϞ āχāĻŽā§‡āϞ āĻ āĻŋāĻ•āĻžāύāĻžāϝāĻŧ āĻŦ⧇āύāĻžāĻŽā§€ āĻ āĻŋāĻ•āĻžāύāĻžāϝāĻŧ āĻĒāĻžāĻ āĻžāύ⧋ āχāĻŽā§‡āϞāϗ⧁āϞāĻŋ āĻĢāϰāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āĻ•āϰ⧇āĨ¤

āĻ…ā§āϝāĻžāĻĒāϞ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āϤāĻĨā§āϝ āĻļ⧇āϝāĻŧāĻžāϰ āĻ•āϰ⧇ āϝ⧇āĻŽāύ āĻĄāĻŋāϏāĻĒā§āϞ⧇ āύāĻžāĻŽ āĻ…ā§āϝāĻžāĻĒ⧇āϰ āϏāĻžāĻĨ⧇ āĻĒā§āϰāĻĨāĻŽāĻŦāĻžāϰ āϝāĻ–āύ āϕ⧋āύ⧋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āϏāĻžāχāύ āχāύ āĻ•āϰ⧇āĨ¤ āϏāĻžāϧāĻžāϰāĻŖāϤ, Firebase āĻĄāĻŋāϏāĻĒā§āϞ⧇ āύāĻžāĻŽ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧇ āϝāĻ–āύ āϕ⧋āύ⧋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻ…ā§āϝāĻžāĻĒāϞ⧇āϰ āϏāĻžāĻĨ⧇ āĻĒā§āϰāĻĨāĻŽāĻŦāĻžāϰ āϏāĻžāχāύ āχāύ āĻ•āϰ⧇, āϝāĻž āφāĻĒāύāĻŋ auth.CurrentUser.DisplayName āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻĒ⧇āϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ āϝāĻžāχāĻšā§‹āĻ•, āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āφāϗ⧇ Firebase āĻŦā§āϝāĻŦāĻšāĻžāϰ āύāĻž āĻ•āϰ⧇ āĻ…ā§āϝāĻžāĻĒ⧇ āϕ⧋āύ⧋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇ āϏāĻžāχāύ āχāύ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ Apple āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āύ, āϤāĻžāĻšāϞ⧇ Apple āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻĒā§āϰāĻĻāĻ°ā§āĻļāύ⧇āϰ āύāĻžāĻŽ āĻĻāĻŋāϝāĻŧ⧇ Firebase āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰāĻŦ⧇ āύāĻžāĨ¤

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

āĻāĻ•āϜāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻĒā§āϰāĻĨāĻŽāĻŦāĻžāϰ āϏāĻžāχāύ āχāύ āĻ•āϰāĻžāϰ āĻĒāϰ⧇, āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻšāϝāĻŧ āĻāĻŦāĻ‚ āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰāϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇ āϞāĻŋāĻ™ā§āĻ• āĻ•āϰāĻž āĻšāϝāĻŧ—āĻ…āĻ°ā§āĻĨāĻžā§Ž, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āύāĻžāĻŽ āĻāĻŦāĻ‚ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ, āĻĢā§‹āύ āύāĻŽā§āĻŦāϰ, āĻŦāĻž āĻĒā§āϰāĻŽāĻžāĻŖ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀āϰ āϤāĻĨā§āϝ — āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āϏāĻžāχāύ āχāύ āĻ•āϰ⧇āϛ⧇āύāĨ¤ āĻāχ āύāϤ⧁āύ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟāϟāĻŋ āφāĻĒāύāĻžāϰ āĻĢāĻžāϝāĻŧāĻžāϰāĻŦ⧇āϏ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āĻ…āĻ‚āĻļ āĻšāĻŋāϏāĻžāĻŦ⧇ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇ āĻāĻŦāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āϕ⧀āĻ­āĻžāĻŦ⧇ āϏāĻžāχāύ āχāύ āĻ•āϰ⧁āύ āύāĻž āϕ⧇āύ, āφāĻĒāύāĻžāϰ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻ…ā§āϝāĻžāĻĒ āϜ⧁āĻĄāĻŧ⧇ āĻāĻ•āϜāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇ āĻļāύāĻžāĻ•ā§āϤ āĻ•āϰāϤ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇, āφāĻĒāύāĻŋ Firebase.Auth.FirebaseUser āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻĨ⧇āϕ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻŽā§ŒāϞāĻŋāĻ• āĻĒā§āϰ⧋āĻĢāĻžāχāϞ āϤāĻĨā§āϝ āĻĒ⧇āϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻĻ⧇āϖ⧁āύāĨ¤

āφāĻĒāύāĻžāϰ āĻĢāĻžāϝāĻŧāĻžāϰāĻŦ⧇āϏ āϰāĻŋāϝāĻŧ⧇āϞāϟāĻžāχāĻŽ āĻĄā§‡āϟāĻžāĻŦ⧇āϏ āĻāĻŦāĻ‚ āĻ•ā§āϞāĻžāωāĻĄ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ āϏ⧁āϰāĻ•ā§āώāĻž āύāĻŋāϝāĻŧāĻŽā§‡, āφāĻĒāύāĻŋ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āϭ⧇āϰāĻŋāϝāĻŧ⧇āĻŦāϞ āĻĨ⧇āϕ⧇ āϏāĻžāχāύ-āχāύ āĻ•āϰāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻ…āύāĻ¨ā§āϝ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āφāχāĻĄāĻŋ āĻĒ⧇āϤ⧇ āĻĒāĻžāϰ⧇āύ āĻāĻŦāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āϕ⧋āύ āĻĄā§‡āϟāĻž āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ āϤāĻž āύāĻŋāϝāĻŧāĻ¨ā§āĻ¤ā§āϰāĻŖ āĻ•āϰāϤ⧇ āĻāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤