iOS, Sign in with Apple ID

iDOยท2021๋…„ 12์›” 28์ผ
0

iOS

๋ชฉ๋ก ๋ณด๊ธฐ
6/8
post-thumbnail

๐Ÿง ์ง„ํ–‰ํ•˜๋Š” ํ† ์ด ํ”„๋กœ์ ํŠธ์—์„œ ๋กœ๊ทธ์ธ ๊ตฌํ˜„์„ ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ์œผ๋กœ๋งŒ ๊ตฌ์„ฑํ–ˆ๋Š”๋ฐ ์†Œ์…œ ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์‹œ ์• ํ”Œ ๋กœ๊ทธ์ธ์„ ํ•„์ˆ˜๋กœ ๋„ฃ์–ด์•ผํ•œ๋‹ค ํ•˜๋”๋ผ๊ณ ์š”! ๊ทธ๋ž˜์„œ ์ด๋ฒˆ์— ์• ํ”Œ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์„ ๋„์ ์—ฌ ๋ณผ๊นŒํ•ฉ๋‹ˆ๋‹ค!

Step 1

์• ํ”Œ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ์• ํ”Œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋“ฑ๋ก๋˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค! Apple Developer์—์„œ Account์—์„œ Certificates, Identifiers & Profiles -> Identifiers ๋กœ ๊ฐ€์‹ ๋‹ค์Œ ํ•ด๋‹น ์•ฑ์—์„œ Sign in with apple์„ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค.

Step 2

Signing & Capabilities์—์„œ + Capability๋ฅผ ๋ˆŒ๋Ÿฌ Sign in with Apple์„ ์ถ”๊ฐ€ํ•ด์ค์‹œ๋‹ค.

Step 3

AuthenticationServices์„ import ํ•ด์ค๋‹ˆ๋‹ค.

โ„๏ธ ViewController.swift

import UIKit
import AuthenticationServices

class ViewController: UIViewController {
    ...
}
Step 4

ASAuthorizationAppleIDButton์„ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค(์•„๋ž˜ ์ฝ”๋“œ์—์„œ layout ๊ตฌ์„ฑ์„ ํ•˜๋Š”๋ฐ SnapKit์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.).

โ„๏ธ ViewController.swift

import UIKit
import AuthenticationServices
import SnapKit

class ViewController: UIViewController {

    override func loadView() {
        self.view.addSubview(appleLoginButton)
        appleLoginButton.snp.makeConstraints {
            make.height.equalTo(50)
            make.leading.equalToSuperview().offset(20)
            make.trailing.equalToSuperview().offset(-20)
            make.centerY.equalToSuperview()
    }
}

...

    private lazy var appleLoginButton: ASAuthorizationAppleIDButton = {
     let button = ASAuthorizationAppleIDButton()
     button.addTarget(self, action: #selector(appleLogin), for: .touchUpInside)
     return button
    }()
}
Step 5

ASAuthorizationControllerDelegate์™€ ASAuthorizationControllerPresentationContextProviding ๋ฅผ ์ฑ„ํƒํ•ด์ฃผ๊ณ  ์š”๊ตฌ๋˜๋Š” ๋ฉ”์†Œ๋“œ์ธ ๋ฉ”์†Œ๋“œ๋ฅผ ์•„๋ž˜ ์˜ˆ์‹œ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.

โ„๏ธ ViewController.swift

...
extension LoginViewController: ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding {
	func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
	switch authorization.credential {
    case let appleIDCredential as ASAuthorizationAppleIDCredential:
        let accessToken = String(data: appleIDCredential.identityToken!, encoding: .ascii) ?? ""
        //TODO: Send ID token to backend.
        print("Token: \(accessToken)")
    default:
        break
    }
}
    
    func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
        print("Error: \(error.localizedDescription)")
    }
    
    func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {
        return self.view.window!
    }
}
Step 6

๋ฒ„ํŠผ ์•ก์…˜์„ ์™„์„ฑํ•ด ์ฃผ์…”์•ผํ•ฉ๋‹ˆ๋‹ค.

โ„๏ธ ViewController.swift

class ViewController: UIViewController {
    ...
   @objc private func appleLogin() {
    let appleIDProvider = ASAuthorizationAppleIDProvider()
    let request = appleIDProvider.createRequest()
    request.requestedScopes = [.fullName]
    let authorizationController = ASAuthorizationController(authorizationRequests: [request])
    authorizationController.delegate = self
    authorizationController.presentationContextProvider = self
    authorizationController.performRequests()
    }
}
...

- End -

์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ Apple ๋กœ๊ทธ์ธ ๊ธฐ๋ณธ์ ์ธ ๊ตฌํ˜„์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„ํ•œ ํ›„ ๋“œ๋Š” ์˜๋ฌธ์ด ์‚ฌ์šฉ์ž๊ฐ€ Apple ์ž์ฒด์ ์œผ๋กœ ์šฐ๋ฆฌ ์•ฑ์— ๋Œ€ํ•ด Apple ID ์‚ฌ์šฉ ์ค‘๋‹จ์„ ํ•ด๋ฒ„๋ฆฌ๋ฉด ์šฐ๋ฆฌ ์„œ๋ฒ„์—์„œ๋Š” ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋“ค์„ ์–ด๋–ป๊ฒŒ ์ง€์šฐ์ง€..?๐Ÿค”๐Ÿ˜…
์ข€ ๋” ๊ณ ๋ฏผํ•˜๊ณ  ๋ณด์ถฉํ•˜๋Š” ๊ฑธ๋กœ๐Ÿ˜‚

๐Ÿง(์•„๋ž˜ ์ฐธ๊ณ ๋‚ด์šฉ์„ ํ†ตํ•ด ๋” ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!)
Apple Developer

profile
์ด๊ณณ์€ ์ €๋ฅผ ์œ„ํ•œ iOS ์„ค๋ช…์„œ์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€