[iOS] Apple 소셜 로그인

Charlie·2023년 5월 19일
0

Apple Social Login

목록 보기
1/2
post-thumbnail

이번에 새롭게 애플 소셜 로그인을 구현하게 되면서 다시 한번 정리해보려 한다.

0. 설정 및 버튼 준비

우선 Xcode와 개발자 웹사이트에서 Sign in with Apple 기능을 활성화 해준다.
그리고 애플 로그인 버튼을 만들어주면 되는데, 애플에서 ASAuthorizationAppleIDButton 을 제공해준다. 만약 버튼을 커스텀하려면 HIG를 참고하여 버튼의 디자인 기준을 만족해야한다.


1. Apple Login Controller

Controller 띄우기

이제 버튼을 누르면 Apple Login Controller를 보여주면 된다.
로그인 인증 창을 띄우기 위해서는 ViewController가 ASAuthorizationControllerPresentationContextProviding 프로토콜을 따르게 하고, 아래와 같이 메소드를 구현하면 된다.

import AuthenticationServices

// ...

public func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {
    self.view.window!
}

위 코드를 작성하면 구현한 ViewController에서 Apple Login Controller를 띄울 수 있게 된다.

Controller 설정

이제 ASAuthorizationControllerDelegate 프로토콜을 채택하여 애플 로그인 인증과 관련한 것들을 설정하고 처리할 수 있다.

let appleIDProvider = ASAuthorizationAppleIDProvider()
let request = appleIDProvider.createRequest()
request.requestedScopes = [.fullName, .email]
let authorizationController = ASAuthorizationController(authorizationRequests: [request])

authorizationController.delegate = self
authorizationController.presentationContextProvider = contextProvider
authorizationController.performRequests()

버튼을 눌렀을 때 위와 같이 controller를 설정해준 후 요청을 할 수 있다.
위에서는 사용자의 fullName, email을 요청하고 delegate 및 contextProvider를 설정하고 있다.

delegateASAuthorizationControllerDelegate를 채택하는 친구로 설정하고 (이후 response에 대한 처리를 한다)
presentationContextProvider는 위에서 설정한 ASAuthorizationControllerPresentationContextProviding 프로토콜을 채택하는 친구로 설정해준 후 요청을 보낸다.


2. 로그인 결과

이후 요청에 대한 응답을 처리하기 위해 아래와 같이 메소드를 구현하면 된다.

func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
    if let credential = authorization.credential as? ASAuthorizationAppleIDCredential {
        let identifier = credential.user	// user identifier
        let name = credential.fullName		// full name
        let email = credential.email		// email
        
        // 로그인 성공
    }
}

func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
    // 로그인 에러
}
  • user identifier : Apple ID의 고유한 값으로 변경되지 않음.
  • full name : 사용자의 이름
  • email : 사용자의 이메일

여기서 name과 email은 최초 로그인 시에만 받아올 수 있고, 그 이후로는 리턴하지 않는다.


3. 로그인 상태 확인

애플 소셜 로그인의 상태를 확인하기 위해서는 다음과 같이 코드를 작성하면 된다.

let appleIDProvider = ASAuthorizationAppleIDProvider()
appleIDProvider.getCredentialState(forUserID: /* 로그인에 사용한 User Identifier */) { (credentialState, error) in
    switch credentialState {
    case .authorized:
        // The Apple ID credential is valid.
    case .revoked
        // The Apple ID credential is revoked, so show the sign-in UI.
    case .notFound:
        // The Apple ID credential is not found, so show the sign-in UI.
    default:
        break
    }
}

일반적으로 AppDelegate의 앱 실행 시 메소드에 로그인 상태를 판별한다.

앱을 실행하다가 아이폰 설정 - 애플 계정 - 암호 및 보안 - Apple로 로그인 에서 Apple ID 사용을 중단할 수도 있다.
런타임에서는 아래 코드를 추가하여 이를 모니터할 수 있다.

NotificationCenter.default.addObserver(forName: ASAuthorizationAppleIDProvider.credentialRevokedNotification, object: nil, queue: nil) { (Notification) in
    print("Revoked Notification")
    // 로그인 페이지로 이동
}

이 또한 AppDelegate 등에서 적절히 처리해주면 된다.


Reference

Apple Developer Document
iOS Sign In with Apple 적용하기
[Swift] 애플 로그인 구현 (Sign in with Apple)

profile
Hello

0개의 댓글