samsung-ga / woody-iOS-tip

🐶 iOS에 대한 소소한 팁들과 개발하다 마주친 버그 해결기, 그리고 오늘 배운 것들을 모아둔 레포
19 stars 0 forks source link

[TIL] Sign In with Apple #13

Open samsung-ga opened 2 years ago

samsung-ga commented 2 years ago

Sign In with Apple

iOS 13.0+ | Xcode 11.3+ 이후부터 사용 가능

🚀 개념 설명

🚀 사용법

1. Capability 추가



2. 버튼 추가하기



3. Apple Login 인증 창 띄우기

Apple Login 인증 창에서 사용자의 email과 FullName을 보여준다. 이 때 사용자는 이메일 공유방법을 선택할 수 있는데, 이메일 가리기를 선택하게 되면 실제 이메일을 사용하여 ~@privaterelay.appleid.com 의 형태로 임의로 생성된 이메일 주소를 받는다. ⚠️ 최초 애플 로그인을 시도 시에만 email과 fullName을 애플에서 제공되며, 두 번째 인증부터는 제공되지 않는다.



4. Apple Login 인증 결과 다루기



5. 세션 변경 처리하기 & 자동 로그인


🚀 몇가지 객체 정의




Reference

samsung-ga commented 2 years ago

다수의 소셜 로그인 방법이 존재하기 때문에 코드가 복잡해질 것을 방지하기 위해여 애플 로그인만을 담당하는 Manager를 별도로 생성하는 방법
AppleLoginManager.swift


protocol AppleLoginManagerDelegate: AnyObject {
    func appleLoginFail()
    func appleLoginSuccess()
}

final class AppleLoginManager: NSObject {
    weak var viewController: UIViewController?
    weak var delegate: AppleLoginManagerDelegate?

    func setAppleLoginPresentationAnchorView(_ viewController: UIViewController) {
        self.viewController = viewController
    }
}

extension AppleLoginManager: ASAuthorizationControllerPresentationContextProviding {
    func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {
        return viewController!.view.window!
    }
}

extension AppleLoginManager: ASAuthorizationControllerDelegate {
    func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
        if let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential {
            let userIdentifier = appleIDCredential.user
            let userName = appleIDCredential.fullName
            let userEmail = appleIDCredential.email

            delegate?.appleLoginSuccess()

        }
    }

    func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
        delegate?.appleLoginFail()
    }
}