[iOS] 애플 로그인

애플 로그인

사용법

  1. 버튼 생성 방법
@available(iOS 13.0, *)
private func setAppleLoginButton() {
    let appleLoginButton = ASAuthorizationAppleIDButton()
    appleLoginButton.addTarget(
        self,
        action: #selector(appleLoginBtnTap),
        for: .touchUpInside
    )
    
    self.view.addSubview(appleLoginButton)
    
    // snapkit을 이용하여 constraint 설정
    appleLoginButton.snp.makeConstraints {
        $0.centerX.equalTo(self.view.safeAreaLayoutGuide.snp.centerX)
        $0.top.equalTo(stackView).offset(120)
        $0.width.equalTo(350)
        $0.height.equalTo(50)
    }
}

스크린샷 2021-05-07 오전 10 05 54

스크린샷 2021-05-07 오전 10 07 03

  1. 애플 로그인 화면을 호출하고 인증하는 과정
    @available(iOS 13.0, *)
    extension AppleLogin: ASAuthorizationControllerDelegate,
                       ASAuthorizationControllerPresentationContextProviding {
        
     // 어떤 화면에서 애플 로그인 화면이 호출될지 지정해주는 메소드
     func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {
         return self.view.window    
     }
        
     public func runAppleLogin() {
         let provider = ASAuthorizationAppleIDProvider()
         provider.getCredentialState(forUserID: UserDefaultsManager.userId) { credentialState, error in
             switch credentialState {
             case .authorized:
                 // Apple ID Credential is valid
                 loginWithApple()
             case .revoked:
                 // Apple ID Credential revoked, handle unlink
             case .notFound:
                 // Credential not found, show login UI
                 loginWithApple()
             default:
                 break
             }
         }
     }
        
     private func loginWithApple() {
         let request = ASAuthorizationAppleIDProvider().createRequest()
         request.requestedScopes = [.fullName, .email]
         let controller = ASAuthorizationController(authorizationRequests: [request])
         controller.delegate = self
         controller.presentationContextProvider = self
         controller.performRequests()
     }
    
     // 애플 로그인 성공시 호출되는 메소드
     func authorizationController(controller _: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
            
         // 애플에서 제공해주는 정보를 받아서 사용 가능
         guard let credential = authorization.credential as? ASAuthorizationAppleIDCredential else {
             return
         }
            
         let fullName = (credential.fullName?.familyName ?? "") + (credential.fullName?.givenName  ?? "")
         print("FullName: \(fullName)")
            
         print(String(data: credential.identityToken!, encoding: .utf8)!)
    
     }
        
     // 애플 로그인 에러시 호출되는 메소드
     func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
         guard let error = error as? ASAuthorizationError else {return}
            
         switch error.code {
         case .canceled:
             print("Canceled")
         case .unknown:
             print("Unknow")
         case .invalidResponse:
             print("invalid Respone")
         case .notHandled:
             print("Not Handled")
         case .failed:
             print("Failed")
         default:
             print("Default")
         }
     }
    }
    
       - ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding 이 두가지 메소드를 상속받고 구현해야 한다.
    
let request = ASAuthorizationAppleIDProvider().createRequest()
request.requestedScopes = [.fullName, .email]
let controller = ASAuthorizationController(authorizationRequests: [request])
controller.delegate = self
controller.presentationContextProvider = self
controller.performRequests()

스크린샷 2021-05-07 오전 10 08 15

  1. 프로젝트 설정 추가
    • Signing & Capabilities -> + capability -> Sign in with Apple 추가
    • 패키지 폴더에 entitlements 파일이 생긴것을 확인
  2. 애플 디벨로퍼 사이트에 sign in with apple 기능 추가