iOS/Swift

[Swift] 애플 로그인 구현 (Sign in with Apple)

HUISOO 2020. 6. 10. 14:30

이 포스트는 애플 로그인(Sign in with Apple)을 설명하기 위한 포스팅입니다 :)

 

애플의 공식 문서를 기반으로 작성하였으며, 애플 로그인에 대한 애플의 가이드라인은 여기에서 확인하실 수 있습니다.

 

최종 수정일 - 20. 06. 12 PM 02:00



애플 로그인 버튼 사용해보기

 

1. 로그인 화면으로 사용할 ViewController.swift 를 준비합니다.

 

2. ViewController 에 Apple 로그인을 사용하기 위한 프레임워크 추가합니다.

import AuthenticationServices

 

3. 애플 로그인 버튼으로 사용할 뷰를 추가합니다.

  - 저는 스토리보드를 이용하였지만, 추가하는 방법은 취향껏해도 됩니다.

// Storyboard
@IBOutlet weak var appleSignInButton: UIStackView!

// Programmatically
var appleSignInButton: UIStackView!

 

4. 버튼으로 사용할 뷰에 애플 로그인 버튼을 생성합니다.

  - 프레임워크에서 제공하는 버튼의 타입과 스타일을 선택합니다.

  - 사용자 설정 버튼은 포스트 하단에 설명이 있습니다. 추가 예정

// Apple ID 로그인 버튼 생성
func setAppleSignInButton() {
    let authorizationButton = ASAuthorizationAppleIDButton(type: .signIn, style: .whiteOutline)
    authorizationButton.addTarget(self, action: #selector(appleSignInButtonPress), for: .touchUpInside)
    self.appleSignInButton.addArrangedSubview(authorizationButton)
}

  - signIn : Sign in with Apple (Apple로 로그인)

  - signUp : Sign Up with Apple (Apple로 등록)

  - continue : Continue with Apple (Apple로 계속하기)

 

 

5. 생성한 버튼을 눌렀을때 행동을 설정해줍니다.

  - 요청으로 얻을 수 있는 값은 이름과 이메일이 있습니다.

// Apple Login Button Pressed
@objc func appleSignInButtonPress() {
    let appleIDProvider = ASAuthorizationAppleIDProvider()
    let request = appleIDProvider.createRequest()
    request.requestedScopes = [.fullName, .email]
        
    let authorizationController = ASAuthorizationController(authorizationRequests: [request])
    authorizationController.delegate = self
    authorizationController.presentationContextProvider = self
    authorizationController.performRequests()
}

 

6. ViewController 에 ASAuthorizationControllerPresentationContextProviding 을 상속 후 아래 함수를 추가합니다.

  - 버튼을 눌렀을때 Apple 로그인을 모달 시트로 표시하는 함수입니다.

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

 

7. ViewController 에 ASAuthorizationControllerDelegate를 상속합니다.

// 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 email = appleIDCredential.email
            
        print("User ID : \(userIdentifier)")
        print("User Email : \(email ?? "")")
        print("User Name : \((fullName?.givenName ?? "") + (fullName?.familyName ?? ""))")

    default:
        break
    }
}
    
// Apple ID 연동 실패 시
func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
    // Handle error.
}

  - authorizationController(controller:didCompleteWithAuthorization:)는 Apple ID에 연동 성공 시 실행되는 함수입니다.

  - authorizationController(controller:didCompleteWithError:) 실패 실행되는 함수입니다.

 

8.  SIgning & Capabilities 에서 Sign in with Apple 을 추가합니다.

9. 앱 실행

 

  - 이름의 경우 누르면 수정이 가능합니다.

  - 이메일의 경우 '나의 이메일 가리기' 를 선택하면  XXXXXXX@privaterelay.appleid.com 와 같은 형태로 앱에 제공됩니다.

 

10. 로그인 완료 시 데이터 형태

// 최초 로그인 시
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 사용 중단'


다음은 앱 실행 시 로그인 상태 확인에 관한 내용입니다

 

AppDelegate.swift 에서 application(_:didFinishLaunchingWithOptions:)에 아래 함수를 추가합니다.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    let appleIDProvider = ASAuthorizationAppleIDProvider()
    appleIDProvider.getCredentialState(forUserID: /* 로그인에 사용한 User Identifier */) { (credentialState, error) in
        switch credentialState {
        case .authorized:
            // The Apple ID credential is valid.
            print("해당 ID는 연동되어있습니다.")
        case .revoked
            // The Apple ID credential is either revoked or was not found, so show the sign-in UI.
            print("해당 ID는 연동되어있지않습니다.")
        case .notFound:
            // The Apple ID credential is either was not found, so show the sign-in UI.
            print("해당 ID를 찾을 수 없습니다.")
        default:
            break
        }
    }
    return true
}

  - authorized : 해당 User Identifier 값이 앱과 연결이 허가되어있다.

  - revoked : 해당 User Identifier 값이 앱과 연결이 취소되어있다.

  - notFound : 해당 User Identifier 값이 앱과 연결을 찾을 수 없다.

 

 


앱 실행 중 강제로 연결 취소 시

 

 

앱 실행 중 [설정 앱] - [Apple ID] - [암호 및 보안] - [내 Apple ID를 사용하는 앱] 에서 'Apple ID 사용 중단' 했을 경우 앱으로 돌아왔을때

AppDelegate.swift 에서 application(_:didFinishLaunchingWithOptions:)에 아래 함수를 추가합니다.

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

 


사용자 설정 버튼 생성

 

추가 예정입니다.