apple login with swift

성민·2023년 7월 24일
0

swift

목록 보기
4/6

애플에서 제공하는 버튼컴퍼넌트가 아닌 커스텀 버튼을 사용할때 사용하는 방법

  1. delegate에서 ASAuthorizationController의 처리를 위한 윈도우르 추적하기 위한 환경 설정

struct WindowKey: EnvironmentKey {
    struct Value {
        weak var value: UIWindow?
    }
    
    static let defaultValue: Value = .init(value: nil)
}

extension EnvironmentValues {
    var window: UIWindow? {
        get {
            return self[WindowKey.self].value
        }
        set {
            self[WindowKey.self] = .init(value: newValue)
        }
    }
}
  1. 애플 로그인 delegate처리 및 토큰응답을 받는 코디네이터

import SwiftUI
import AuthenticationServices

class AppleSinginCoordinator: NSObject, ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding {
    
    let window: UIWindow?
    
    init(window: UIWindow?) {
        self.window = window
    }
    
    func startLogin() {
        let appleIDProvider = ASAuthorizationAppleIDProvider()
        let request = appleIDProvider.createRequest()
        request.requestedScopes = [.fullName, .email]
        let authorizationController = ASAuthorizationController(authorizationRequests: [request])
        authorizationController.delegate = self
        authorizationController.presentationContextProvider = self
        authorizationController.performRequests()
    }
    
    func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
        if let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential {
            // Apple ID 자격 증명에서 필요한 사용자 데이터 추출하여 처리
            let userID = appleIDCredential.user
            let email = appleIDCredential.email
            let fullName = appleIDCredential.fullName
            // ...
            print(appleIDCredential)
            
            guard let appleIDToken = appleIDCredential.identityToken else {
                print("Unable to fetch identity token")
                return
            }
            
            guard let idTokenString = String(data: appleIDToken, encoding: .utf8) else {
                print("Unable to serialize token string from data: \(appleIDToken.debugDescription)")
                return
            }
            print(appleIDCredential.user)
            print(idTokenString)
        } else {
            print("error")
        }
    }
    
    // Apple ID 연동 실패 시
    func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
        // Handle error.
    }
    
    func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {
        return window!
    }
}
  1. 환경변수 추가
	let rootView = SplashUI().environment(\.window, window)
  1. 뷰에서 사용

    @Environment(\.window) var window: UIWindow?
    @State private var appleLoginCoordinator: AppleSinginCordinator?
    // 로그인 화면 출력
    appleLoginCoordinator = AppleSinginCoordinator(window: window)
    appleLoginCoordinator?.startLogin()

1개의 댓글

comment-user-thumbnail
2023년 7월 24일

좋은 글 감사합니다. 자주 올게요 :)

답글 달기