Apple Developer - Identifiers에 접속하여 Sign in with Apple을 체크 후 저장합니다
Identifier의 설정을 변경 후 저장하게 된다면 기존 사용 중이던 profile provisioning이 invalid되기 때문에 profile provisioning을 발급받아 사용중이라면 재발급이 필요합니다
Xcode - Targets - Capabillities에 Sign in Apple을 추가하게되면 애플 로그인을 위한 기본 세팅이 완료됩니다.
appleLoginButton.rx.tap
.throttle(.seconds(2), scheduler: MainScheduler.instance)
.subscribe(onNext: {
let appleIDProvider = ASAuthorizationAppleIDProvider()
let request = appleIDProvider.createRequest()
request.requestedScopes = [.fullName, .email]
let authorizationController = ASAuthorizationController(authorizationRequests: [request])
authorizationController.delegate = self
authorizationController.presentationContextProvider = self
authorizationController.performRequests()
})
.disposed(by: bag)
apple signup request에서 얻을 수 있는 scope 및 delegate를 설정합니다.
설정 가능한 scope는 이름과 이메일이 있습니다.
extension OnboardingViewController: ASAuthorizationControllerPresentationContextProviding, ASAuthorizationControllerDelegate {
// Apple 로그인을 모달 시트
func presentationAnchor(for _: ASAuthorizationController) -> ASPresentationAnchor {
return view.window!
}
// Apple ID 연동 성공 시
func authorizationController(controller _: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
switch authorization.credential {
// Apple ID
case let appleIDCredential as ASAuthorizationAppleIDCredential:
// 계정 정보 가져오기
let userIdentifier = appleIDCredential.user
let fullName = appleIDCredential.fullName
let name = (fullName?.familyName ?? "") + (fullName?.givenName ?? "")
let email = appleIDCredential.email
print("User ID : \(userIdentifier)")
print("User Email : \(email ?? "")")
print("User Name : \((fullName?.givenName ?? "") + (fullName?.familyName ?? ""))")
let auth = AuthModel(type: .apple,
identyfier: userIdentifier,
email: email,
name: name)
viewModel.auth.onNext(auth)
default:
break
}
}
// Apple ID 연동 실패 시
func authorizationController(controller _: ASAuthorizationController, didCompleteWithError _: Error) {
// Handle error.
}
}
authorizationController(controller:didCompleteWithAuthorization:)는 Apple ID에 연동 성공 시 실행되는 함수입니다.
authorizationController(controller:didCompleteWithError:)는 실패 시 실행되는 함수입니다.
signup 성공 시 user 정보를 이용하여 자체 server와 signin or signup 과정을 수행하면 됩니다.
// 최초 로그인 시
User ID : [User Identifier]
User Email : XXXXXX@privaterelay.appleid.com
User Name : 김범수
// 이후 로그인 시
User ID : [User Identifier]
User Email :
User Name :
최초 로그인에만 이름과 이메일을 받을 수 있습니다.
두번째 로그인부터는 앱에서 Apple ID 사용 중단하기 전까지 ID 값만 리턴해줍니다.
[설정 앱] - [Apple ID] - [암호 및 보안] - [내 Apple ID를 사용하는 앱] 에서 'Apple ID 사용 중단'