[iOS] 애플 로그인

김범수·2022년 6월 2일
1

소셜 로그인

목록 보기
1/2

1. Apple Developer - Identifiers 설정


Apple Developer - Identifiers에 접속하여 Sign in with Apple을 체크 후 저장합니다

Identifier의 설정을 변경 후 저장하게 된다면 기존 사용 중이던 profile provisioning이 invalid되기 때문에 profile provisioning을 발급받아 사용중이라면 재발급이 필요합니다

2. Xcode - Targets - Capabillities 설정


Xcode - Targets - Capabillities에 Sign in Apple을 추가하게되면 애플 로그인을 위한 기본 세팅이 완료됩니다.

3. Sign in


  • 로그인 버튼 클릭 시
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는 이름과 이메일이 있습니다.

  • ViewController에 ASAuthorizationControllerPresentationContextProviding, ASAuthorizationControllerDelegate 상속
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 사용 중단'

profile
iOS Developer

0개의 댓글