Apple āĻāĻŦāĻ‚ C++ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻ•āϰ⧁āύ

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

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

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

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

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

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

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

āĻāĻ•āϟāĻŋ āϏāĻžāχāύ-āχāύ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀ āĻšāĻŋāϏāĻžāĻŦ⧇ 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::Auth āĻ•ā§āϞāĻžāϏ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻ•āϰ⧁āύ

Auth āĻ•ā§āϞāĻžāϏ āĻšāϞ āϏāĻŽāĻ¸ā§āϤ API āĻ•āϞ⧇āϰ āϗ⧇āϟāĻ“āϝāĻŧ⧇āĨ¤
  1. Auth āĻāĻŦāĻ‚ āĻ…ā§āϝāĻžāĻĒ āĻšā§‡āĻĄāĻžāϰ āĻĢāĻžāχāϞ āϝ⧋āĻ— āĻ•āϰ⧁āύ:
    #include "firebase/app.h"
    #include "firebase/auth.h"
  2. āφāĻĒāύāĻžāϰ āχāύāĻŋāĻļāĻŋāϝāĻŧāĻžāϞāĻžāχāĻœā§‡āĻļāύ āϕ⧋āĻĄā§‡, āĻāĻ•āϟāĻŋ firebase::App āĻ•ā§āϞāĻžāϏ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύāĨ¤
    #if defined(__ANDROID__)
      firebase::App* app =
          firebase::App::Create(firebase::AppOptions(), my_jni_env, my_activity);
    #else
      firebase::App* app = firebase::App::Create(firebase::AppOptions());
    #endif  // defined(__ANDROID__)
  3. āφāĻĒāύāĻžāϰ firebase::App āϜāĻ¨ā§āϝ firebase::auth::Auth āĻ•ā§āϞāĻžāϏ āĻ…āĻ°ā§āϜāύ āĻ•āϰ⧁āύāĨ¤ App āĻāĻŦāĻ‚ Auth āĻŽāĻ§ā§āϝ⧇ āĻ“āϝāĻŧāĻžāύ-āϟ⧁-āĻ“āϝāĻŧāĻžāύ āĻŽā§āϝāĻžāĻĒāĻŋāĻ‚ āφāϛ⧇āĨ¤
    firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);

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

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

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

āφāĻĒāύāĻžāϰ C++ āϕ⧋āĻĄ āĻĨ⧇āϕ⧇ āφāĻŽāĻ¨ā§āĻ¤ā§āϰāĻŋāϤ Apple āϏāĻžāχāύ āχāύ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟāĻŋāĻ­-āϏāĻŋ SDK-āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ Firebase-āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āφāĻĒāύāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻ•āϰ⧁āύāĨ¤

  1. āĻĒā§āϰāϤāĻŋāϟāĻŋ āϏāĻžāχāύ-āχāύ āĻ…āύ⧁āϰ⧋āϧ⧇āϰ āϜāĻ¨ā§āϝ, āĻāĻ•āϟāĻŋ āĻāϞ⧋āĻŽā§‡āϞ⧋ āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āĻ¨â€”āĻāĻ•āϟāĻŋ "āύāύāϏ"—āϝāĻž āφāĻĒāύāĻŋ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāϤ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ⧇āύ āϝ⧇ āφāĻĒāύāĻŋ āϝ⧇ āφāχāĻĄāĻŋ āĻŸā§‹āϕ⧇āύāϟāĻŋ āĻĒ⧇āϝāĻŧ⧇āϛ⧇āύ āϤāĻž āφāĻĒāύāĻžāϰ āĻ…ā§āϝāĻžāĻĒ⧇āϰ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāĻŖ āĻ…āύ⧁āϰ⧋āϧ⧇āϰ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻšāĻŋāϏāĻžāĻŦ⧇ āĻŦāĻŋāĻļ⧇āώāĻ­āĻžāĻŦ⧇ āĻŽāĻžā§āϜ⧁āϰ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇āĨ¤ āϰāĻŋāĻĒā§āϞ⧇ āφāĻ•ā§āϰāĻŽāĻŖ āĻĒā§āϰāϤāĻŋāϰ⧋āϧ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻāχ āĻĒāĻĻāĻ•ā§āώ⧇āĻĒāϟāĻŋ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖāĨ¤

      - (NSString *)randomNonce:(NSInteger)length {
        NSAssert(length > 0, @"Expected nonce to have positive length");
        NSString *characterSet = @"0123456789ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz-._";
        NSMutableString *result = [NSMutableString string];
        NSInteger remainingLength = length;
    
        while (remainingLength > 0) {
          NSMutableArray *randoms = [NSMutableArray arrayWithCapacity:16];
          for (NSInteger i = 0; i < 16; i++) {
            uint8_t random = 0;
            int errorCode = SecRandomCopyBytes(kSecRandomDefault, 1, &random);
            NSAssert(errorCode == errSecSuccess, @"Unable to generate nonce: OSStatus %i", errorCode);
    
            [randoms addObject:@(random)];
          }
    
          for (NSNumber *random in randoms) {
            if (remainingLength == 0) {
              break;
            }
    
            if (random.unsignedIntValue < characterSet.length) {
              unichar character = [characterSet characterAtIndex:random.unsignedIntValue];
              [result appendFormat:@"%C", character];
              remainingLength--;
            }
          }
        }
      }
    
    

    āφāĻĒāύāĻŋ āφāĻĒāύāĻžāϰ āϏāĻžāχāύ-āχāύ āĻ…āύ⧁āϰ⧋āϧ⧇āϰ āϏāĻžāĻĨ⧇ āύāύāϏ⧇āϰ SHA256 āĻšā§āϝāĻžāĻļ āĻĒāĻžāĻ āĻžāĻŦ⧇āύ, āϝāĻž Apple āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻžāϝāĻŧ āĻ…āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāĻŋāϤ āĻĒāĻžāϏ āĻ•āϰāĻŦ⧇āĨ¤ Firebase āφāϏāϞ āύāĻ¨ā§āϏ āĻšā§āϝāĻžāĻļ āĻ•āϰ⧇ āĻāĻŦāĻ‚ Apple āĻĻā§āĻŦāĻžāϰāĻž āĻĒāĻžāϏ āĻ•āϰāĻž āĻŽāĻžāύ⧇āϰ āϏāĻžāĻĨ⧇ āϤ⧁āϞāύāĻž āĻ•āϰ⧇ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āϝāĻžāϚāĻžāχ āĻ•āϰ⧇āĨ¤

  2. Apple-āĻāϰ āϏāĻžāχāύ-āχāύ āĻĢā§āϞ⧋ āĻļ⧁āϰ⧁ āĻ•āϰ⧁āύ, āφāĻĒāύāĻžāϰ āĻ…āύ⧁āϰ⧋āϧ⧇ āύāύāϏ⧇āϰ SHA256 āĻšā§āϝāĻžāĻļ āĻāĻŦāĻ‚ āĻ…ā§āϝāĻžāĻĒāϞ⧇āϰ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāĻŦ⧇ āĻāĻŽāύ āĻĒā§āϰāϤāĻŋāύāĻŋāϧāĻŋ āĻ•ā§āϞāĻžāϏ āϏāĻš (āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āϧāĻžāĻĒāϟāĻŋ āĻĻ⧇āϖ⧁āύ):

      - (void)startSignInWithAppleFlow {
        NSString *nonce = [self randomNonce:32];
        self.currentNonce = nonce;
        ASAuthorizationAppleIDProvider *appleIDProvider = [[ASAuthorizationAppleIDProvider alloc] init];
        ASAuthorizationAppleIDRequest *request = [appleIDProvider createRequest];
        request.requestedScopes = @[ASAuthorizationScopeFullName, ASAuthorizationScopeEmail];
        request.nonce = [self stringBySha256HashingString:nonce];
    
        ASAuthorizationController *authorizationController =
            [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[request]];
        authorizationController.delegate = self;
        authorizationController.presentationContextProvider = self;
        [authorizationController performRequests];
      }
    
      - (NSString *)stringBySha256HashingString:(NSString *)input {
        const char *string = [input UTF8String];
        unsigned char result[CC_SHA256_DIGEST_LENGTH];
        CC_SHA256(string, (CC_LONG)strlen(string), result);
    
        NSMutableString *hashed = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
        for (NSInteger i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
          [hashed appendFormat:@"%02x", result[i]];
        }
        return hashed;
      }
    
  3. āφāĻĒāύāĻžāϰ ASAuthorizationControllerDelegate` āĻŦāĻžāĻ¸ā§āϤāĻŦāĻžāϝāĻŧāύ⧇ āĻ…ā§āϝāĻžāĻĒāϞ⧇āϰ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰ⧁āύāĨ¤ āϏāĻžāχāύ-āχāύ āϏāĻĢāϞ āĻšāϞ⧇, āĻĢāĻžāϝāĻŧāĻžāϰāĻŦ⧇āϏ⧇āϰ āϏāĻžāĻĨ⧇ āĻĒā§āϰāĻŽāĻžāĻŖā§€āĻ•āϰāϪ⧇āϰ āϜāĻ¨ā§āϝ āφāύāĻšā§āϝāĻžāĻļāĻĄ āύāĻ¨ā§āϏ āϏāĻš āĻ…ā§āϝāĻžāĻĒāϞ⧇āϰ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻĨ⧇āϕ⧇ āφāχāĻĄāĻŋ āĻŸā§‹āϕ⧇āύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ:

      - (void)authorizationController:(ASAuthorizationController *)controller
         didCompleteWithAuthorization:(ASAuthorization *)authorization API_AVAILABLE(ios(13.0)) {
        if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) {
          ASAuthorizationAppleIDCredential *appleIDCredential = authorization.credential;
          NSString *rawNonce = self.currentNonce;
          NSAssert(rawNonce != nil, @"Invalid state: A login callback was received, but no login request was sent.");
    
          if (appleIDCredential.identityToken == nil) {
            NSLog(@"Unable to fetch identity token.");
            return;
          }
    
          NSString *idToken = [[NSString alloc] initWithData:appleIDCredential.identityToken
                                                    encoding:NSUTF8StringEncoding];
          if (idToken == nil) {
            NSLog(@"Unable to serialize id token from data: %@", appleIDCredential.identityToken);
          }
        }
    
  4. āĻāĻ•āϟāĻŋ āĻĢāĻžāϝāĻŧāĻžāϰāĻŦ⧇āϏ āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻāĻŦāĻ‚ Firebase-āĻ āϏāĻžāχāύ āχāύ āĻ•āϰāϤ⧇ āĻĢāϞāĻ¸ā§āĻŦāϰ⧂āĻĒ āĻŸā§‹āϕ⧇āύ āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚ āĻāĻŦāĻ‚ āφāϏāϞ āύāĻ¨ā§āϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤

    firebase::auth::OAuthProvider::GetCredential(
            /*provider_id=*/"apple.com", token, nonce,
            /*access_token=*/nullptr);
    
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInAndRetrieveDataWithCredential(credential);
    
  5. āĻāĻ•āχ āĻĒā§āϝāĻžāϟāĻžāĻ°ā§āύ Reauthenticate āϏāĻžāĻĨ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇ āϝāĻž āϏāĻžāĻŽā§āĻĒā§āϰāϤāĻŋāĻ• āϞāĻ—āχāύ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻāĻŽāύ āϏāĻ‚āĻŦ⧇āĻĻāύāĻļā§€āϞ āĻ…āĻĒāĻžāϰ⧇āĻļāύāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āύāϤ⧁āύ āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰāϤ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

    firebase::Future<firebase::auth::AuthResult> result =
        user->Reauthenticate(credential);
    
  6. āĻ…ā§āϝāĻžāĻĒāϞ āϏāĻžāχāύ āχāύ⧇āϰ āϏāĻžāĻĨ⧇ āĻāĻ•āϟāĻŋ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϞāĻŋāĻ™ā§āĻ• āĻ•āϰāϤ⧇ āĻāĻ•āχ āĻĒā§āϝāĻžāϟāĻžāĻ°ā§āύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āϝāĻžāχāĻšā§‹āĻ•, āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ āĻ¤ā§āϰ⧁āϟāĻŋāϰ āϏāĻŽā§āĻŽā§āĻ–ā§€āύ āĻšāϤ⧇ āĻĒāĻžāϰ⧇āύ āϝāĻ–āύ āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ Firebase āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇āχ āφāĻĒāύāĻŋ āϝ⧇ Apple āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āĻŸā§‡āϰ āϏāĻžāĻĨ⧇ āϞāĻŋāĻ™ā§āĻ• āĻ•āϰāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰāϛ⧇āύ āϤāĻžāϰ āϏāĻžāĻĨ⧇ āϞāĻŋāĻ™ā§āĻ• āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇⧎ āĻāϟāĻŋ āϘāϟāϞ⧇ āĻ­āĻŦāĻŋāĻˇā§āĻ¯ā§Ž kAuthErrorCredentialAlreadyInUse āĻāϰ āĻāĻ•āϟāĻŋ āĻ¸ā§āĻĨāĻŋāϤāĻŋ āĻĢāĻŋāϰāĻŋāϝāĻŧ⧇ āĻĻ⧇āĻŦ⧇ āĻāĻŦāĻ‚ AuthResult āĻāĻ•āϟāĻŋ āĻŦ⧈āϧ credential āĻĨāĻžāĻ•āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻāχ āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰāϟāĻŋ āĻ…āĻ¨ā§āϝ āĻ…ā§āϝāĻžāĻĒāϞ āϏāĻžāχāύ āχāύ āĻŸā§‹āϕ⧇āύ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻ›āĻžāĻĄāĻŧāĻžāχ SignInAndRetrieveDataWithCredential āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻ…ā§āϝāĻžāĻĒāϞ-āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āĻŸā§‡ āϏāĻžāχāύ āχāύ āĻ•āϰāϤ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

    firebase::Future<firebase::auth::AuthResult> link_result =
        auth->current_user().LinkWithCredential(credential);
    
    // To keep example simple, wait on the current thread until call completes.
    while (link_result.status() == firebase::kFutureStatusPending) {
      Wait(100);
    }
    
    // Determine the result of the link attempt
    if (link_result.error() == firebase::auth::kAuthErrorNone) {
      // user linked correctly.
    } else if (link_result.error() ==
                   firebase::auth::kAuthErrorCredentialAlreadyInUse &&
               link_result.result()
                   ->additional_user_info.updated_credential.is_valid()) {
      // Sign In with the new credential
      firebase::Future<firebase::auth::AuthResult> result =
          auth->SignInAndRetrieveDataWithCredential(
              link_result.result()->additional_user_info.updated_credential);
    } else {
      // Another link error occurred.
    }

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

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

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

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

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

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

    // Localize to French.
    provider_data.custom_parameters["language"] = "fr";
    ```
    
  4. āĻāĻ•āĻŦāĻžāϰ āφāĻĒāύāĻžāϰ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀āϰ āĻĄā§‡āϟāĻž āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ āĻšāϝāĻŧ⧇ āϗ⧇āϞ⧇, āĻāĻ•āϟāĻŋ FederatedOAuthProvider āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤

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

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

    firebase::Future<firebase::auth::AuthResult> result =
      auth->SignInWithProvider(provider_data);
    

    āφāĻĒāύāĻžāϰ āφāĻŦ⧇āĻĻāύāϟāĻŋ āϤāĻ–āύ āĻ…āĻĒ⧇āĻ•ā§āώāĻž āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ āĻŦāĻž āĻ­āĻŦāĻŋāĻˇā§āϝāϤ⧇ āĻāĻ•āϟāĻŋ āĻ•āϞāĻŦā§āϝāĻžāĻ• āύāĻŋāĻŦāĻ¨ā§āϧāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ ⧎

  6. āĻāĻ•āχ āĻĒā§āϝāĻžāϟāĻžāĻ°ā§āύ ReauthenticateWithProvider āϏāĻžāĻĨ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇ āϝāĻž āϏāĻžāĻŽā§āĻĒā§āϰāϤāĻŋāĻ• āϞāĻ—āχāύ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻāĻŽāύ āϏāĻ‚āĻŦ⧇āĻĻāύāĻļā§€āϞ āĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϞāĻžāĻĒ⧇āϰ āϜāĻ¨ā§āϝ āύāϤ⧁āύ āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰ āĻĒ⧁āύāϰ⧁āĻĻā§āϧāĻžāϰ āĻ•āϰāϤ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

    firebase::Future<firebase::auth::AuthResult> result =
      user.ReauthenticateWithProvider(provider_data);
    

    āφāĻĒāύāĻžāϰ āφāĻŦ⧇āĻĻāύāϟāĻŋ āϤāĻ–āύ āĻ…āĻĒ⧇āĻ•ā§āώāĻž āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ āĻŦāĻž āĻ­āĻŦāĻŋāĻˇā§āϝāϤ⧇ āĻāĻ•āϟāĻŋ āĻ•āϞāĻŦā§āϝāĻžāĻ• āύāĻŋāĻŦāĻ¨ā§āϧāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ ⧎

  7. āĻāĻŦāĻ‚, āφāĻĒāύāĻŋ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āĻŸā§‡ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻĒāϰāĻŋāϚāϝāĻŧ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀āϕ⧇ āϞāĻŋāĻ™ā§āĻ• āĻ•āϰāϤ⧇ LinkWithCredential() āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

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

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

    // Initialize a Facebook credential with a Facebook access token.
    AuthCredential credential =
        firebase::auth::FacebookAuthProvider.getCredential(token);
    
    // Assuming the current user is an Apple user linking a Facebook provider.
    firebase::Future<firebase::auth::AuthResult> result =
        auth.current_user().LinkWithCredential(credential);
    

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

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

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

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

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

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

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

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