이번에 새롭게 애플 소셜 로그인을 구현하게 되면서 다시 한번 정리해보려 한다.
우선 Xcode와 개발자 웹사이트에서 Sign in with Apple 기능을 활성화 해준다.
그리고 애플 로그인 버튼을 만들어주면 되는데, 애플에서 ASAuthorizationAppleIDButton 을 제공해준다. 만약 버튼을 커스텀하려면 HIG를 참고하여 버튼의 디자인 기준을 만족해야한다.
이제 버튼을 누르면 Apple Login Controller를 보여주면 된다.
로그인 인증 창을 띄우기 위해서는 ViewController가 ASAuthorizationControllerPresentationContextProviding
프로토콜을 따르게 하고, 아래와 같이 메소드를 구현하면 된다.
import AuthenticationServices
// ...
public func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {
self.view.window!
}
위 코드를 작성하면 구현한 ViewController에서 Apple Login 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를 설정하고 있다.
delegate
은 ASAuthorizationControllerDelegate
를 채택하는 친구로 설정하고 (이후 response에 대한 처리를 한다)
presentationContextProvider
는 위에서 설정한 ASAuthorizationControllerPresentationContextProviding
프로토콜을 채택하는 친구로 설정해준 후 요청을 보낸다.
이후 요청에 대한 응답을 처리하기 위해 아래와 같이 메소드를 구현하면 된다.
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) {
// 로그인 에러
}
여기서 name과 email은 최초 로그인 시에만 받아올 수 있고, 그 이후로는 리턴하지 않는다.
애플 소셜 로그인의 상태를 확인하기 위해서는 다음과 같이 코드를 작성하면 된다.
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 등에서 적절히 처리해주면 된다.
Apple Developer Document
iOS Sign In with Apple 적용하기
[Swift] 애플 로그인 구현 (Sign in with Apple)