이 포스트는 애플 로그인(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")
// 로그인 페이지로 이동
}
사용자 설정 버튼 생성
추가 예정입니다.
'iOS > Swift' 카테고리의 다른 글
[Swift] textViewDidChange(_:) 위치값 초기화 현상 수정 (0) | 2022.08.22 |
---|---|
[Swift] 화면 눌러서 키보드 내리기 (Tap to hide keyboard) (0) | 2022.08.12 |
[Swift] 속성 문자열 사용법 (NSAttributedString) (0) | 2022.08.12 |
[Swift] 원형 프로그래스 바 구현 (Custom circular progress bar) (0) | 2022.08.12 |
[Swift] 구글 로그인 구현 (Sign in with Google) (0) | 2020.06.29 |