์•ˆ๋…•ํ•˜์„ธ์š”! ์˜ค๋Š˜์€ ์•ฑ ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ 'Sign in with Apple'์„ ํ†ตํ•ฉํ•˜๋ฉด์„œ ์ง๋ฉดํ–ˆ๋˜ ํŠน์ • ๋ฌธ์ œ์™€ ๊ทธ ํ•ด๊ฒฐ ๊ณผ์ •์— ๋Œ€ํ•ด ๊ณต์œ ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ, Apple ๋กœ๊ทธ์ธ ์‹œ ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„์„ ์ž๋™์œผ๋กœ ์ฑ„์šฐ๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„๊ณผ ๊ด€๋ จ๋œ ๋‚ด์šฉ์„ ์ค‘์ ์ ์œผ๋กœ ๋‹ค๋ฃฐ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

๋ฌธ์ œ ์ƒํ™ฉ

์•ฑ ์ œ์ถœ ํ›„, ์• ํ”Œ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์‹ฌ์‚ฌ ๊ฒฐ๊ณผ์ค‘ ๋ถ€์ ๊ฒฉ ์‚ฌ์œ  ํ•˜๋‚˜๊ฐ€ ๊ณ„์† ๋ฐ˜๋ณต๋˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
์ฒ˜์Œ์—” ์—ฌ๋Ÿฌ ์‹ฌ์‚ฌ ๋ถ€์ ๊ฒฉ ์‚ฌ์œ ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ, ๋‹ค๋ฅธ ๋‚ด์šฉ๋“ค์€ ๋ฉ”๋ชจ์— ์ ์ ˆํžˆ ์ด์œ ๋ฅผ ์ ์–ด
ํ†ต๊ณผ๋Š” ๋˜์—ˆ๊ณ  ๊ธฐ์ˆ ์  ๋ฌธ์ œ๋Š” ์•„๋‹ˆ์—ˆ์œผ๋‚˜, ๋กœ๊ทธ์ธ ๋””์ž์ธ ๊ฐ€์ด๋“œ ๋ผ์ธ์ด
๊ณ„์† ๋‚ด ๋ฐœ๋ชฉ์„ ์žก์•˜์Šต๋‹ˆ๋‹ค. ..๐Ÿคฃ

 

๋”๋ณด๊ธฐ

Guideline 4.0 - Design

Your app offers Sign in with Apple as a login option but does not follow the design and user experience requirements for Sign in with Apple.

  • Specifically your app requires users to provide their name after using Sign in with Apple. This information is already provided by the Authentication Services framework.

Next Steps

Please revise the Sign in with Apple experience in your app to address the issues we identified above.

Please see attached screenshot for details.

์šฐ๋ฆฌ ์•ฑ์€ 'Sign in with Apple' ๋กœ๊ทธ์ธ ์˜ต์…˜์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ, ์• ํ”Œ์˜ ๋””์ž์ธ ๋ฐ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ฐ€์ด๋“œ๋ผ์ธ 4.0์„ ์™„์ „ํžˆ ์ค€์ˆ˜ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ์ ์—์„œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ Apple๋กœ ๋กœ๊ทธ์ธํ•œ ํ›„ ์ถ”๊ฐ€์ ์œผ๋กœ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๋„๋ก ์š”๊ตฌํ–ˆ๋Š”๋ฐ, ์ด ์ •๋ณด๋Š” ์ด๋ฏธ Authentication Services ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ†ตํ•ด ์ œ๊ณต๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ '์ด๋ฆ„' ํ•„๋“œ์— ์ฑ„์›Œ์ ธ์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.
(์ด๋ฏธ ์ด๋ฆ„ ๊ฐ’์ด ์žˆ์œผ๋ฉด ์ž๋™์œผ๋กœ ์ฑ„์›Œ์ง€๊ฒŒ ํ•ด๋†”์„œ ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ์‹œ์—๋Š” ์ž˜ ๋˜๋Š”๋ฐ ์• ํ”Œ ๋กœ๊ทธ์ธ์‹œ์—๋Š” ์™œ ์•ˆ์ฑ„์›Œ์ง€๋Š” ๊ฑธ๊นŒ.. )

r9vJSWX.png|298

์• ํ”Œ ๋กœ๊ทธ์ธ์‹œ ์ด๋ฆ„ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š”๋ฐ ์™œ ๋˜ ์ž…๋ ฅํ•ด์•ผํ•˜๋ƒ,, ์ด๊ฒŒ ์• ํ”Œ์˜ ์ž…์žฅ!.

 

๋กœ๊ทธ๋ฅผ ์ฐ์–ด๋ณด๋ฉด ์ฒ˜์Œ ๋กœ๊ทธ์ธ ํ• ๋•Œ๋Š” appleCredintial์˜ givenName ๊ณผ familyName๋งŒ ๋“ค์–ด์˜ค๊ณ  ํ•ด๋‹น ๋‚ด์šฉ์œผ๋กœ displayName์„ ์—…๋ฐ์ดํŠธ ํ•˜๋ฉด ๋˜๋Š”๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ•ด๋‹น ๋ถ€๋ถ„์„ ์ ์šฉ ํ•˜์˜€๋‹ค.
์•Œ๋ ค์ง„ ํ•ด๊ฒฐ๋ฐฉ๋ฒ• ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์„œ!!..

 

์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ์ ์šฉ์„ ํ•œ ๋’ค์— fullName ์ด ์ ์šฉ๋˜๋Š”๊ฑธ ํ™•์ธํ–ˆ์ง€๋งŒ
๊ทธ๋ž˜๋„ ๊ฐ€์ด๋“œ๋ผ์ธ์— ํ†ต๊ณผ๊ฐ€ ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
ํ•ด๋‹น ํ…Œ์ŠคํŠธ ๋ฐฉ์‹์—๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ..
์—ฌ๋Ÿฌ ์‹œ๋„๋ฅผ ํ•œ ๊ฒฐ๊ณผ ์•„๋ž˜ ๋ฌธ์ œ ์žฌํ˜„์„ ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ ์ƒํ™ฉ ์žฌํ˜„

๊ธฐ์กด์˜ ์ ‘๊ทผ ๋ฐฉ์‹์—์„œ ์šฐ๋ฆฌ ์•ฑ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ€์ž…์„ ์‹œ๋„ํ•  ๋•Œ ์ž๋™์œผ๋กœ fullName ์ •๋ณด๋ฅผ ๋ฐ›์•„์™€ ํ™”๋ฉด์— ํ‘œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์ด ์›ํ™œํ•˜๊ฒŒ ์ง„ํ–‰๋˜์–ด, ์‹ฌ์‚ฌ ๊ณผ์ •์—์„œ ๊ณ„์†ํ•ด์„œ ๊ฑฐ์ ˆ๋˜๋Š” ์ •ํ™•ํ•œ ์›์ธ์„ ํŒŒ์•…ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ์ƒˆ๋กœ์šด ์• ํ”Œ ID๋กœ ๊ฐ€์ž…์„ ์‹œ๋„ํ–ˆ์„ ๋•Œ fullName ์ •๋ณด๊ฐ€ ์ œ๊ณต๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐœ๊ฒฌ์„ ๋ฐ”ํƒ•์œผ๋กœ, ์šฐ๋ฆฌ๋Š” ์‹ฌ์‚ฌ์—์„œ ์ง€์ ๋œ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๊ณ  ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ช…ํ™•ํ•œ ๊ธฐ์ค€์„ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ณผ์ •์„ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค:

  1. ๊ณ„์ • ํƒˆํ‡ด ๋ฐ ๋ฐ์ดํ„ฐ ์‚ญ์ œ
    • ์‚ฌ์šฉ์ž๊ฐ€ ์• ํ”Œ ID๋กœ ๊ฐ€์ž…ํ•œ ๊ณ„์ •์„ ํƒˆํ‡ด์‹œํ‚ค๊ณ , ์ด๋กœ ์ธํ•ด ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ Firebase ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ญ์ œ๋˜์–ด ์‹œ์Šคํ…œ์—์„œ ์™„์ „ํžˆ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.
  2. ์• ํ”Œ ๋กœ๊ทธ์•„์›ƒ ๋ฐ ์žฌ๋กœ๊ทธ์ธ
    • ๊ณ„์ •์„ ํƒˆํ‡ดํ•œ ์‚ฌ์šฉ์ž๋Š” ์• ํ”Œ์—์„œ ๋กœ๊ทธ์•„์›ƒํ•œ ํ›„, ๋™์ผํ•œ ์• ํ”Œ ID๋กœ ๋‹ค์‹œ ๋กœ๊ทธ์ธ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์„ ํ†ตํ•ด 'Sign in with Apple'์„ ํ†ตํ•œ ์ƒˆ๋กœ์šด ์„ธ์…˜์„ ์‹œ์ž‘ํ•˜๋ฉฐ, Apple์€ ์‚ฌ์šฉ์ž์—๊ฒŒ fullName ์ •๋ณด๋ฅผ ๋‹ค์‹œ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  3. fullName ์ •๋ณด์˜ ์ ์šฉ ์—ฌ๋ถ€ ํ™•์ธ
    • ์žฌ๋กœ๊ทธ์ธ ํ›„, ๊ฐ€์ž… ๊ณผ์ •์—์„œ fullName ์ •๋ณด๊ฐ€ ์ด๋ฆ„ ๋ฐ ๋‹‰๋„ค์ž„ ํ•„๋“œ์— ์ ์šฉ๋˜๋Š”์ง€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋ฐœ๊ฒฌ๋œ ๋ฌธ์ œ๋Š”, userCredential.user.displayName์ด ์—…๋ฐ์ดํŠธ ๋˜์–ด๋„ ์ฆ‰์‹œ ํ•ด๋‹น ๊ฐ’์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ null์ด ๋ฐ˜ํ™˜๋œ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
  4. ์žฌ๋กœ๊ทธ์ธ ํ›„ ๊ฐ€์ž… ์‹œ๋‚˜๋ฆฌ์˜ค์˜ ๋ฌธ์ œ
    • ์‚ฌ์šฉ์ž๊ฐ€ ์žฌ๋กœ๊ทธ์ธ ํ›„ ์ฒซ ๊ฐ€์ž…์‹œ ์ทจ์†Œํ•˜๊ณ  ๊ทธ ๋’ค์— ๋‹ค์‹œ ๊ฐ€์ž…์„ ์‹œ๋„ํ•  ๊ฒฝ์šฐ, ์ด์ „ ๋‹จ๊ณ„์—์„œ displayName์ด ์ด๋ฏธ ์—…๋ฐ์ดํŠธ๋˜์–ด ์žˆ์–ด ์ •๋ณด๊ฐ€ ํ™”๋ฉด์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ์ด๋Š” ์ฒซ ๊ฐ€์ž… ์‹œ๋„ ์‹œ fullName ์ •๋ณด๊ฐ€ ์ ์ ˆํžˆ ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์‹ฌ์‚ฌ ํ†ต๊ณผ์— ํ•„์ˆ˜์ ์ธ ์กฐ๊ฑด์„ ๋งŒ์กฑ์‹œํ‚ค์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. (์ด ๋ถ€๋ถ„์ด ์‹ฌ์‚ฌ ์‹คํŒจ์˜ ํ•ต์‹ฌ ์›์ธ...)

ํ•ด๊ฒฐ ๊ณผ์ •

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์— ์ฒ˜์Œ ๋กœ๊ทธ์ธํ•  ๋•Œ๋Š” fullName ์ •๋ณด๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์‚ฌ์šฉ์ž์˜ displayName์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋™์‹œ์—, ์ด ์—…๋ฐ์ดํŠธ๋œ ์ด๋ฆ„ ์ •๋ณด๋ฅผ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž ๋“ฑ๋ก ๋˜๋Š” ํ™•์ธ ๋กœ์ง์œผ๋กœ ์ง์ ‘ ์ „๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ฒ˜์Œ ๋กœ๊ทธ์ธํ•  ๋•Œ ํ•„์š”ํ•œ ์ด๋ฆ„ ์ •๋ณด๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์— ๋‹ค์‹œ ๋กœ๊ทธ์ธํ•  ๋•Œ๋Š”, Firebase์—์„œ ์—…๋ฐ์ดํŠธ๋œ displayName์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์œผ๋กœ, ์ฒ˜์Œ ๋กœ๊ทธ์ธํ•˜๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ์„œ๋งŒ ์ œ๊ณต๋˜๋Š” fullName ์ •๋ณด๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ํ™œ์šฉํ•˜๊ณ , ๋™์‹œ์— Apple์˜ ๋””์ž์ธ ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์ค€์ˆ˜ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

๊ตฌํ˜„ ์ฝ”๋“œ ์˜ˆ์‹œ

final appleCredential = await SignInWithApple.getAppleIDCredential(
  scopes: [
    AppleIDAuthorizationScopes.email,
    AppleIDAuthorizationScopes.fullName,
  ],
);

final oauthCredential = OAuthProvider("apple.com").credential(
  idToken: appleCredential.identityToken,
  accessToken: appleCredential.authorizationCode,
);

UserCredential userCredential =
    await FirebaseAuth.instance.signInWithCredential(oauthCredential);

if (userCredential.user?.displayName == null &&
    (appleCredential.givenName != null || appleCredential.familyName != null)) {
  // ์‚ฌ์šฉ์ž fullName ์ƒ์„ฑ (์ตœ์ดˆ ๊ฐ€์ž…์‹œ์—๋งŒ ๊ฐ€์ ธ์˜จ๋‹ค)
  final updatedDisplayName = [
    appleCredential.familyName ?? '',
    appleCredential.givenName ?? '',
  ].join(' ').trim(); 

  // ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„ ์ •๋ณด๋ฅผ ์—…๋ฐ์ดํŠธ
  await userCredential.user?.updateDisplayName(updatedDisplayName);

  // ์‚ฌ์šฉ์ž ๋“ฑ๋ก ๋˜๋Š” ํ™•์ธ ๋กœ์ง์œผ๋กœ ์—…๋ฐ์ดํŠธ๋œ ์ด๋ฆ„ ์ •๋ณด๋ฅผ ์ง์ ‘ ์ „๋‹ฌ
  _proceedWithUserRegistration(userCredential, updatedDisplayName);
} else {
  // ๋‹ค์Œ ๋กœ๊ทธ์ธ ๋•Œ๋Š” ์—…๋ฐ์ดํŠธ๋œ displayName ์‚ฌ์šฉ
  _proceedWithUserRegistration(userCredential, userCredential.user?.displayName);
}

๊ฒฐ๋ก 

apple ์‹ฌ์‚ฌ ์‰ฝ์ง€์•Š๋‹ค..