ram2 ๐Ÿš—

[Swift] apple login ๊ตฌํ˜„ํ•˜๊ธฐ ๋ณธ๋ฌธ

๐ŸŽ Swift

[Swift] apple login ๊ตฌํ˜„ํ•˜๊ธฐ

coram22 2024. 9. 14. 17:50
728x90
๋ฐ˜์‘ํ˜•
๋ฐ˜์‘ํ˜•

๋‹ค๋ฅธ ๋ธ”๋กœ๊ทธ๋“ค ๋ณด๋ฉด ์ง์ ‘ ๊ณต์‹๋ฌธ์„œ ๋ณด๋ฉด์„œ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜์‹œ๋˜๋ฐ,, ๋‚˜๋„ ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ณ  ์‹ถ์€๋ฐ..

์‹œ๊ฐ„์ด ์ƒ๋‹นํžˆ ๋งŽ์ด ๊ฑธ๋ฆฌ๊ฒ ์ง€๋งŒ, ๋„์ „..ํ•ด๋ด์•ผ์ง€..

 

์ด์ „์— ์• ํ”Œ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” ๊ทธ๋ƒฅ ๋ธ”๋กœ๊ทธ๋“ค ์ฐธ๊ณ ํ•ด์„œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ๊ฐ€์ ธ์˜จ ์ฝ”๋“œ๋งŒ ๊ณต๋ถ€ํ•ด์„œ ๊ตฌํ˜„ํ–ˆ์—ˆ๋Š”๋ฐ

์‹œ๊ฐ„๋„ ์žˆ๊ฒ ๋‹ค, ์˜์š•๋„ ์žˆ๊ฒ ๋‹ค ํ•œ ๋ฒˆ ํ•ด๋ด์•ผ๊ฒ ๋‹ค.

 

๊ทธ๋‚˜์ €๋‚˜ ํ•œ๊ธ€ ๊ณต์‹๋ฌธ์„œ๋„ ์žˆ์œผ๋ฉด ๋„ˆ๋ฌด ์ข‹๊ฒ ๋‹ค.

ํ•œ๊ธ€ ๊ณต์‹๋ฌธ์„œ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ด๊ฐ€ ์˜์–ด๋ฅผ ๋” ๊ณต๋ถ€ํ•ด์„œ ์ž˜ํ•˜๋Š”๊ฒŒ ๋น ๋ฅด๋ ค๋‚˜..?

 

 

์ผ๋‹จ ํ•ด๋ณด์ž๊ตฌ..

์•„๋ž˜ ๊ณต์‹๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๊ตฌํ˜„ํ•œ ์• ํ”Œ๋กœ๊ทธ์ธ์ด๋‹ค !

 

https://developer.apple.com/documentation/sign_in_with_apple/implementing_user_authentication_with_sign_in_with_apple

 

Implementing User Authentication with Sign in with Apple | Apple Developer Documentation

Provide a way for users of your app to set up an account and start using your services.

developer.apple.com

 

 

1. Sign in with Apple ์ถ”๊ฐ€ํ•˜๊ธฐ ๋ฐ Identifier ๋“ฑ๋กํ•˜๊ธฐ

Targets → Signing & Capabilities → +Capability ๋ฅผ ๋ˆŒ๋Ÿฌ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

 

(์ด ๋•Œ, Apple developer ๊ตฌ๋…์„ ํ•˜์ง€ ์•Š๋Š” ๊ฐœ๋ฐœ์ž๋ผ๋ฉด, ํ•ด๋‹น ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†๋‹ค..ใ… ใ… )

 

๋‹ค์Œ์€ ์• ํ”Œ ๊ฐœ๋ฐœ์ž ์‚ฌ์ดํŠธ์—์„œ identifier๋ฅผ ๋“ฑ๋กํ•ด์ค˜์•ผ ํ•œ๋‹ค.

๊ฐœ๋ฐœ์ž ์‚ฌ์ดํŠธ์— ๋กœ๊ทธ์ธ์„ ํ•˜๊ณ , Account ํ•ญ๋ชฉ์—์„œ, Identifiers๋ฅผ ๋ˆŒ๋Ÿฌ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ„๋‹ค.

 

๋งŒ์•ฝ, ์ด ๊ณผ์ •์„ ์ง„ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด.. ๋กœ๊ทธ์ธ์ด ๋˜์ง€ ์•Š๊ณ , ์ฝ˜์†”์— ์ถœ๋ ฅํ•ด๋„ ์ž๊พธ null ๊ฐ’์ด ๋‚˜์˜ค๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

(์ €๋„ ์•Œ๊ณ ์‹ถ์ง€ ์•Š์•˜์–ด์š”..)

 

ํŒŒ๋ž€์ƒ‰ + ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์ค€๋‹ค.

 

๊ทธ๋Ÿผ ์ด๋Ÿฐ ์ฐฝ์ด ๋œจ๊ฒŒ ๋˜๋Š”๋ฐ, App ID์™€ ๊ด€๋ จํ•œ ๋‚ด์šฉ์ด๋ฏ€๋กœ ์ด ์ƒํƒœ์—์„œ continue๋ฅผ ํ•ด์ค€๋‹ค.

 

์—ฌ๊ธฐ์„œ๋„ ๊ณ„์† continue๋ฅผ ํ•ด์ค€๋‹ค.

 

 

๊ทธ๋Ÿผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ™”๋ฉด์ด ๋ณด์ธ๋‹ค.

 

Description: ํŠน์ˆ˜๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ , Identifier์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์„ค๋ช…์„ ์ ์œผ๋ฉด ๋œ๋‹ค.

Bundle ID: App์˜ TARGETS → Signing & Capabilities์—์„œ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋‚ด์šฉ์„ ์ฑ„์šฐ๊ณ , Sign In with Apple์„ ์ฐพ์•„ ์ฒดํฌํ•ด์ค€๋‹ค.

๊ทธ๋ฆฌ๊ณ , Edit์„ ๋ˆŒ๋Ÿฌ ์ง€๊ธˆ ์ง„ํ–‰์ค‘์ธ ํ”„๋กœ์ ํŠธ์˜ app id๋ฅผ ์„ ํƒํ•ด์ฃผ์—ˆ๋‹ค.

 

์ด๋Œ€๋กœ next๋ฅผ ๋ˆ„๋ฅด๊ณ , register๊นŒ์ง€ ํ–ˆ๋Š”๋ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒ์—…์ด ๋ฐœ์ƒํ–ˆ๋‹ค.

 

์ฐพ์•„๋ณด๋‹ˆ, ์ด ์—๋Ÿฌ๋Š” Bundle ID ์•ž์— ํŒ€ ID(Apple์—์„œ ์ƒ์„ฑ๋œ)๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์„ ๋•Œ ์ƒ๊ธด๋‹ค๊ณ  ํ•œ๋‹ค.

๊ทธ๋ƒฅ ์ €๊ธฐ ์žˆ๋Š” ์ฃผํ™ฉ์ƒ‰ ๋ถ€๋ถ„์„ ๋ฒˆ๋“ค์•„์ด๋”” ๊ฐ€์žฅ ์•ž์— ๋ถ™์—ฌ๋„ฃ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

 

 

ํ›„ ์ด์ œ ์„ธํŒ…๋“ค์€ ๋ชจ๋‘ ๋๋‚ฌ๋‹ค !!

์• ํ”Œ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•  ์ฝ”๋“œ๋งŒ ์งœ๋ฉด ๋œ๋‹ค.

 

๊ณต์‹ ๋ฌธ์„œ์—์„œ ์ œ๊ณตํ•œ ์˜ˆ์ œ ์ฝ”๋“œ๋Š” ์Šคํ† ๋ฆฌ๋ณด๋“œ ๊ธฐ๋ฐ˜์ด์—ˆ๊ธฐ์— ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์—†์—ˆ๋‹ค.

๋‚˜๋Š” UIKit์„ ์‚ฌ์šฉํ•˜๋˜, ์Šคํ† ๋ฆฌ๋ณด๋“œ๊ฐ€ ์•„๋‹Œ ์ฝ”๋“œ๋กœ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”์ง€ ํ•ด๋ณด๊ฒ ๋‹ค !

 

 

 

2. AuthenticationServices import ํ•˜๊ธฐ

๋จผ์ € ์• ํ”Œ๋กœ๊ทธ์ธ ๊ตฌํ˜„์ด ํ•„์š”ํ•œ AuthenticationServices๋ฅผ ํŒŒ์ผ์— import ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

import AuthenticationServices

 

 

 

3. ๋ฒ„ํŠผ ๋งŒ๋“ค๊ธฐ

func setupAppleLoginButton() {
    // ASAuthorizationAppleIDButton์„ ์‚ฌ์šฉํ•ด ์• ํ”Œ ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ์ƒ์„ฑ
    let appleLoginButton = ASAuthorizationAppleIDButton(type: .signIn, style: .whiteOutline)
    appleLoginButton.translatesAutoresizingMaskIntoConstraints = false
    appleLoginButton.addTarget(self, action: #selector(handleAuthorizationAppleIDButtonPress), for: .touchUpInside)

    // ๋ฒ„ํŠผ์„ ํ™”๋ฉด์— ์ถ”๊ฐ€
    self.view.addSubview(appleLoginButton)

    // ์˜คํ† ๋ ˆ์ด์•„์›ƒ ์„ค์ •
    NSLayoutConstraint.activate([
        appleLoginButton.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
        appleLoginButton.centerYAnchor.constraint(equalTo: self.view.centerYAnchor),
        appleLoginButton.heightAnchor.constraint(equalToConstant: 50),
        appleLoginButton.widthAnchor.constraint(equalToConstant: 300)
    ])
}

 

์ด๋ ‡๊ฒŒ ์˜คํ† ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ๋ฒ„ํŠผ์˜ ํฌ๊ธฐ์™€ ์œ„์น˜๋ฅผ ์žก์•„์ฃผ์—ˆ๋‹ค.

์• ํ”Œ์€ ์• ํ”Œ๋กœ๊ทธ์ธ API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•Œ์•„์„œ ๋ฒ„ํŠผ์„ ๋””์ž์ธํ•ด์ฃผ๊ณ , default๋กœ ๋””์ž์ธ๋˜์–ด ์žˆ๋Š” ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ƒ‰์ƒ, ๋””์ž์ธ์ด ์ด๋ฏธ ์ง€์ •๋˜์–ด ์žˆ์–ด ์ƒํ™ฉ์— ๋งž๊ฒŒ ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ผ๊ณ  HIG์—๋„ ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์ œ์‹œํ•œ๋‹ค.

 

๋‚˜๋Š” ์ผ๋‹จ SignIn ํƒ€์ž…์œผ๋กœ ์•„์›ƒ๋ผ์ธ์ด ํฐ์ƒ‰์ธ ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์—ˆ๋‹ค. 

ASAuthorizationAppleIDButton์ด๋ผ๋Š” ํ•จ์ˆ˜๋งŒ ๊ฐ€์ ธ์˜ค๋ฉด ๋ฐ”๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค !!

 

์ด์ œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ, ํ˜ธ์ถœํ•  ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์ค˜์•ผํ•œ๋‹ค.

 

 

 

 

3. ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์• ํ”Œ๋กœ๊ทธ์ธ ๊ตฌํ˜„ํ•˜๊ธฐ

๋‚˜๋Š” ์ผ๋‹จ ๊ณต์‹๋ฌธ์„œ์— ์žˆ๋Š” handleAuthorizationAppleIDButtonPress ํ•จ์ˆ˜๋ฅผ ๊ทธ๋Œ€๋กœ ์—ฐ๊ฒฐํ•ด์ฃผ์—ˆ๋‹ค.

// apple id๋กœ ๊ถŒํ•œ ์š”์ฒญํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜
@objc func handleAuthorizationAppleIDButtonPress() {
    // ์• ํ”Œ ID Provider ์ƒ์„ฑ (์• ํ”Œ๋กœ๊ทธ์ธ ์š”์ฒญ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ASAuthorizationAppleIDProvider๊ฐ์ฒด์ž„)
    let appleIDProvider = ASAuthorizationAppleIDProvider()
    // ์• ํ”Œ ๋กœ๊ทธ์ธ์— ํ•„์š”ํ•œ request ๊ฐ์ฒด ์ƒ์„ฑํ•˜๊ธฐ
    let request = appleIDProvider.createRequest()
    // ์‚ฌ์šฉ์ž์—๊ฒŒ ์–ป๊ณ ์ž ํ•˜๋Š” ์ •๋ณด ์ง€์ •ํ•˜๊ธฐ (์ด๋ฆ„, ๋ฉ”์ผ)
    request.requestedScopes = [.fullName, .email]

    // ์• ํ”Œ๋กœ๊ทธ์ธ ์ ˆ์ฐจ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ์ด๋‹ค.
    let authorizationController = ASAuthorizationController(authorizationRequests: [request])
    // ๋กœ๊ทธ์ธ ๊ณผ์ •์˜ ์„ฑ๊ณต/์‹คํŒจ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.
    authorizationController.delegate = self
    // ์ธ์ฆ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์–ด๋–ค ํ™”๋ฉด์— ํ‘œ์‹œ๋ ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ถ€๋ถ„. ๋ณดํ†ต ํ˜„์žฌ ํ™”๋ฉด์„ ์ง€์ •ํ•œ๋‹ค.
    authorizationController.presentationContextProvider = self
    // ์• ํ”Œ๋กœ๊ทธ์ธ request ์‹œ์ž‘ !
    authorizationController.performRequests()
}

 

์ด๋ ‡๊ฒŒ ์กฐ๊ธˆ์€ ๋ณต์žกํ•ด๋ณด์ด์ง€๋งŒ, ์šฐ๋ฆฐ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ด€๋ฆฌํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋งŒ๋“ค์–ด ์—ฐ๊ฒฐํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ์• ํ”Œ๋กœ๊ทธ์ธ ๊ณผ์ •์ด ์ง„ํ–‰๋œ๋‹ค.

 

๋‚˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์• ํ”Œ๋กœ๊ทธ์ธ์„ ์™„๋ฃŒํ•˜๋ฉด, ๋กœ๊ทธ์ธ ํ•œ ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„๊ณผ ์ด๋ฉ”์ผ์„ ์„œ๋ฒ„์— ๋„˜๊ฒจ์ค˜์•ผ ํ•˜๊ณ , ์•ฑ ๋‚ด์— ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค.

๊ทธ ์ „์—, ๋ฐ›์€ ์ •๋ณด๋ฅผ ์ž˜ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฝ˜์†”์— ์ถœ๋ ฅํ•ด๋ณด์ž !

 

 

 

 

4. ๋กœ๊ทธ์ธ ์ •๋ณด ์ฝ˜์†”์— ์ถœ๋ ฅํ•˜๊ธฐ

๊ณต์‹๋ฌธ์„œ์—์„œ๋Š” ์„ฑ๊ณตํ–ˆ์„ ๋•Œ ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ํ‚ค์ฒด์ธ์— ์ €์žฅํ•˜๋ผ๊ณ  ํ•œ๋‹ค.

์ด๊ฒŒ ๋ฌด์Šจ๋ง์ธ์ง€ ์ดํ•ด๊ฐ€ ์ž˜ ์•ˆ๋ผ์„œ ์ง€ํ”ผํ‹ฐํ•œํ…Œ ๋ฌผ์–ด๋ดค๋‹ค.

 

์ข€ ๊ธธ๊ธด ํ•˜์ง€๋งŒ,, ์ดํ•ด๋Š” ๋๋‹ค.

ํ•„์ˆ˜๋Š” ์•„๋‹ˆ์ง€๋งŒ ๊ฐœ์ธ์ •๋ณด๋Š” ์†Œ์ค‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์—.. ํ‚ค์ฒด์ธ์— ์ €์žฅํ•ด ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์„ ๋‹ค์‹œ ์‚ญ์ œํ•˜๊ณ  ์žฌ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์•ฑ์„ ์ข…๋ฃŒํ•œ ๋’ค ๋‹ค์‹œ ๋“ค์–ด์™”์„ ๋•Œ ๋‹ค์‹œ ๋กœ๊ทธ์ธํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์„ ์—†์•จ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

์ง€๊ธˆ๊นŒ์ง€ ์• ํ”Œ๋กœ๊ทธ์ธ ๊ทธ์ € ์ฝ”๋“œ๋งŒ ๋„ฃ์–ด์„œ ๊ตฌํ˜„ํ•ด์™”๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ๊ณต๋ถ€ํ•ด๋ณด๋‹ˆ,, ๋” ํŒŒ์•ผํ•  ๊ธธ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

 

ํ‚ค์ฒด์ธ ์ €์žฅ๊นŒ์ง€ ํ•˜๋Š” ๊ณผ์ •์„ ๊ฒฝํ—˜ํ•ด๋ณด๊ณ  ์‹ถ๊ธฐ๋„ ํ•˜์ง€๋งŒ, ๋„ˆ๋ฌด ๋ณต์žกํ• ๊นŒ ๊ฒ์ด ๋‚˜๊ธฐ๋„ ํ•˜๊ณ , ์ง€๊ธˆ ๋กœ๊ทธ์ธ๋ณด๋‹จ ์ฃผ๊ธฐ๋Šฅ ๊ตฌํ˜„์ด ๋” ์šฐ์„ ์ด๊ธฐ์—..! ์ผ๋‹จ ๋‚œ userDefaults์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์„ ์„ ํƒํ•˜๊ฒ ๋‹ค.

 

์กฐ๊ธˆ ๋” ์šฉ๊ฐํ•ด์ ธ์„œ ๋Œ์•„์˜ฌ๊ฒŒ..

 

 

 

๋‹ค์‹œ ๋Œ์•„์™€์„œ, ๋กœ๊ทธ์ธ ์ •๋ณด๋ฅผ ์ฝ˜์†”์— ์ถœ๋ ฅํ•ด๋ณด์ž.

๊ทธ ์ „์—, ํ•œ ๋ฒˆ ๋กœ๊ทธ์ธํ•˜๋ฉด ์ถœ๋ ฅํ•  ๋•Œ userIdentifier๋งŒ ๋ณด์—ฌ์ง€๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐ›์•„์˜ด๊ณผ ๋™์‹œ์— UserDefaults์— ์ €์žฅํ•  ๊ฒƒ์ด๋‹ค.

 

// didCompleteWithAuthorization = ์• ํ”Œ๋กœ๊ทธ์ธ ํ›„ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜
// ์ด ํ•จ์ˆ˜๋Š” ์• ํ”Œ๋กœ๊ทธ์ธ ์ ˆ์ฐจ๊ฐ€ ์™„๋ฃŒ๋œ ๋’ค ํ˜ธ์ถœ๋œ๋‹ค.
func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
    switch authorization.credential {
    
    // case1: ์‚ฌ์šฉ์ž๊ฐ€ apple ID๋กœ ๋กœ๊ทธ์ธํ–ˆ์„ ๋•Œ ๋ฐ˜ํ™˜๋˜๋Š” ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌ
    case let appleIDCredential as ASAuthorizationAppleIDCredential:

        // Create an account in your system.
        let userIdentifier = appleIDCredential.user
        let fullName = appleIDCredential.fullName
        let email = appleIDCredential.email

        print("useridentifier: \(userIdentifier)")
        print("fullName: \(String(describing: fullName))")
        print("email: \(email ?? "failed")")

        // UserDefaults์— ์ด๋ฆ„๊ณผ ์ด๋ฉ”์ผ ์ €์žฅ
        let defaults = UserDefaults.standard

        // Optional fullName ์ฒ˜๋ฆฌ
        if let givenName = fullName?.givenName, let familyName = fullName?.familyName {
            let completeName = "\(givenName) \(familyName)"
            defaults.set(completeName, forKey: "fullName")
            print("Saved fullName: \(completeName)")
        } else {
            defaults.set("", forKey: "fullName") // ์ด๋ฆ„์ด ์—†์„ ๊ฒฝ์šฐ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์ €์žฅ
            print("Saved fullName as empty string")
        }

        if let email = email {
            defaults.set(email, forKey: "email")
            print("Saved email: \(email)")
        } else {
            defaults.set("", forKey: "email") // ์ด๋ฉ”์ผ์ด ์—†์„ ๊ฒฝ์šฐ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์ €์žฅ
            print("Saved email as empty string")
        }

	// case2 : iCloud ํ‚ค์ฒด์ธ์— ์ €์žฅ๋œ ๊ฒƒ์„ ์‚ฌ์šฉํ•ด ๋กœ๊ทธ์ธํ•˜๋Š” ๋ฐฉ์‹ (์—ฌ๊ธฐ์„  ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ)	
    case let passwordCredential as ASPasswordCredential:

        // Sign in using an existing iCloud Keychain credential.
        let username = passwordCredential.user
        let password = passwordCredential.password

        print("passwordCredential = \(username)")
        print("passwordCredential = \(password)")

    default:
        break
    }
}

 

์œ„ ์ฝ”๋“œ๋Š” ๊ณต์‹๋ฌธ์„œ์—์„œ ๊ฐ€์ ธ์™€์„œ ์ถœ๋ ฅํ•˜๊ณ , UserDefaults์— ์ €์žฅํ•˜๋Š” ์ฝ”๋“œ๋งŒ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์งœ๊ณ , ๋นŒ๋“œ๋ฅผ ํ•ด๋ณด์ž !

 

์ด๋ฉ”์ผ ๊ฐ€๋ฆฌ๊ธฐ๋ฅผ ํ•˜๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜์˜จ๋‹ค.

 

์• ํ”Œ ๋กœ๊ทธ์ธ์˜ "์ด๋ฉ”์ผ ๊ฐ€๋ฆฌ๊ธฐ" ๊ธฐ๋Šฅ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ์‹ค์ œ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š๊ณ ๋„ ์• ํ”Œ ID๋ฅผ ํ†ตํ•ด ์„œ๋น„์Šค์— ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

๊ทธ๋ ‡๊ธฐ์— ์‚ฌ์šฉ์ž๊ฐ€ '์ด๋ฉ”์ผ ๊ฐ€๋ฆฌ๊ธฐ'๋กœ ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด, ์• ํ”Œ์€ ์‚ฌ์šฉ์ž๋ฅผ ๋Œ€์‹ ํ•ด ๋ฌด์ž‘์œ„๋กœ ์ƒ์„ฑ๋œ ํ”„๋ก์‹œ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

user@privaterelay.appleid.com ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๋ฉ”์ผ์ด ์ƒ์„ฑ๋œ๋‹ค.

 

์™œ ์•ฑ ๋‚ด์—์„œ ์ตœ์ดˆ ๋กœ๊ทธ์ธ ๋•Œ๋งŒ ์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ ์ด๋ฉ”์ผ์ด ๋‚˜์˜ฌ๊นŒ?

์•ž์—์„œ ๋งํ–ˆ๋“ฏ, ๋ฐ›์•„์˜ด๊ณผ ๋™์‹œ์— UserDefault์— ์ €์žฅํ–ˆ๋˜ ์ด์œ ๋Š” ์ตœ์ดˆ ๋กœ๊ทธ์ธ๋•Œ๋งŒ ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„๊ณผ ์ด๋ฉ”์ผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์™œ ๊ทธ๋Ÿฐ์ง€ ๊ถ๊ธˆํ•ด์„œ ์ฐพ์•„๋ดค๋‹ค.

 

๋ณด์•ˆ์— ์ฒ ์ €ํ•œ ์• ํ”Œ์€ ์• ํ”Œ ๋กœ๊ทธ์ธ์„ ํ†ตํ•ด ์ด๋ฆ„๊ณผ ์ด๋ฉ”์ผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ์ฒ˜์Œ ๋กœ๊ทธ์ธํ•  ๋•Œ์—๋งŒ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•œ๋‹ค.

์ด๋Š” ์• ํ”Œ์ด ์‚ฌ์šฉ์ž์˜ ๊ฐœ์ธ ์ •๋ณด๋ฅผ ์ตœ์†Œํ•œ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ์‹์„ ์ฑ„ํƒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ํ•œ๋‹ค.

  • ์ฒ˜์Œ ๋กœ๊ทธ์ธ ์‹œ ์ •๋ณด ์ œ๊ณต: ์• ํ”Œ ๋กœ๊ทธ์ธ ์ ˆ์ฐจ์—์„œ ์ฒ˜์Œ ๋กœ๊ทธ์ธ์„ ํ•  ๋•Œ, ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„๊ณผ ์ด๋ฉ”์ผ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ ์‚ฌ์šฉ์ž๊ฐ€ ์• ํ”Œ ID๋ฅผ ํ†ตํ•ด ์„œ๋น„์Šค์— ์ฒ˜์Œ ์—ฐ๊ฒฐ๋  ๋•Œ๋งŒ ์ด๋ฆ„๊ณผ ์ด๋ฉ”์ผ์ด ์• ํ”Œ์—์„œ ์ „๋‹ฌ๋œ๋‹ค.
  • ๋‹ค์Œ ๋กœ๊ทธ์ธ ์‹œ ์ด๋ฆ„๊ณผ ์ด๋ฉ”์ผ ์ œ๊ณต ๋ถˆ๊ฐ€: ์ดํ›„ ๋™์ผํ•œ ์• ํ”Œ ID๋กœ ๋กœ๊ทธ์ธํ•  ๋•Œ๋Š” ์• ํ”Œ์—์„œ ์ œ๊ณตํ•˜๋Š” userIdentifier (์• ํ”Œ ID ๊ณ ์œ  ์‹๋ณ„์ž)๋งŒ ์ „๋‹ฌ๋œ๋‹ค. ์ด๋ฆ„์ด๋‚˜ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋Š” ๋‹ค์‹œ ์ œ๊ณต๋˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ ๋ฐ ํ”„๋ผ์ด๋ฒ„์‹œ ๊ฐ•ํ™”๋ฅผ ์œ„ํ•œ ์• ํ”Œ์˜ ์ •์ฑ…์ด๋‹ค.

ํ•˜์ง€๋งŒ, userIdentifier๋Š” ๊ณ„์† ๋ฐ›์•„์˜ด์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด๋Š” ์• ํ”Œ ID ๊ณ ์œ  ์‹๋ณ„์ž๋กœ, ์ด๋ฅผ ์‚ฌ์šฉํ•ด ์‚ฌ์šฉ์ž๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

์–ด์ฉ์ง€ ์•„๋ฌด๋ฆฌ ๋กœ๊ทธ์ธํ•ด๋„ null์ด ๋‚˜์˜ค๋”๋ผ๋‹ˆ..!

์ด๊ฑธ ๋ชจ๋ฅด๋ฉด ๊ตฌํ˜„์ด ์ž˜ ์•ˆ๋œ์ค„ ์•Œ๊ณ  ์‚ฝ์งˆ์„ ๊ฝค๋‚˜ ํ•  ๊ฒƒ ๊ฐ™๋‹ค !!

 

 

์ด์ œ ์• ํ”Œ๋กœ๊ทธ์ธ์€ ๋๋‚ฌ๋‹ค !!

 

๋‹ค์Œ์— ๋‹ค์‹œ ํ™”๋ฉด๋“ค์„ ๋ช‡๊ฐœ ๋งŒ๋“ค๊ณ  ๋‚˜์„œ, ์•ฑ ๋‚ด ์ ‘๊ทผ ํ•  ๋•Œ๋งˆ๋‹ค ๋กœ๊ทธ์ธ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ด ์ ์ ˆํ•œ ํ™”๋ฉด์œผ๋กœ ์ด๋™์‹œํ‚ค๋Š” ์ž๋™๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์ •๋ฆฌํ•ด๋ด์•ผ๊ฒ ๋‹ค !

 

 

ํ›„ ํž˜๋“ค์—ˆ๋‹ค.

 

728x90
๋ฐ˜์‘ํ˜•