본문 바로가기
Developer/iOS, Swift

[Swift] 애플 아이디로 로그인 기능 구현하기

by Doony 2020. 5. 11.

이번 포스팅에서는 애플 아이디로 로그인하는 기능에 대해 알아보겠습니다. 본 포스팅은 DeveloperFury님의 글을 참조했습니다.
또한 애플 개발자 계정에서 키값이나 identifier 등을 설정하는 과정은 생략합니다.

애플 id로 로그인?

보통 앱 사용할 때 구글이나 페이스북, 네이버, 카카오 등 소셜 로그인을 통해 간단하게 가입할 수 있습니다. 애플 id로 로그인하는 것도 이와 동일하며, 작년 개발자 포럼에서 발표된 사항으로 알고 있습니다.


앱 자체 순수 로그인 기능이 아닌, 제 3의 소셜 로그인 기능을 사용하는 앱의 경우, 의무적으로 애플 id로 로그인을 만들 것을 심사 지침에서 확인하실 수 있습니다. 즉, 애플id로 로그인 없이 제 3의 소셜 로그인 기능만으로는 앱을 배포할 수 없습니다. (조금 헷갈리는 부분은, 앱 서비스 자체의 회원가입 기능이 있을 경우는 배포가 가능한지 여부입니다. 영문 지침에서 exclusively라고 써놔있기 때문에... 해보신 분만 알 것 같네요.)


애플 아이디로 로그인할 때 필요한 부분?

소셜 로그인 기능을 사용할 때 필요한 것은, 해당 아이디에 대한 사용자 정보와 JWT 토큰키 발행을 위한 키값 정도일 겁니다. 이번 포스팅에서는 다음 사항을 확인하고 사용할 것입니다.

  • 애플 id로 로그인 버튼 만들기
  • 버튼 클릭 시, 로그인하는 화면 보여주기
  • 로그인했을 때, 적합한 액션 취하기 (ex. 상세 가입페이지로 넘어간다.)

애플 id로 로그인

  • stackView를 스토리보드에 하나 만들고, outlet으로 지정합니다. 이 때 스택뷰는 해당 버튼을 담을 그릇이 되니, 크기나 위치를 적절히 설정합니다.
  • 클릭 시, 액션이 실행될 수 있도록 아래와 같이 함수를 만듭니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@IBOutlet var appleLoginStackView: UIStackView!
 
    
func setLoginButton() {
    if #available(iOS 13.0*) {
        let button = ASAuthorizationAppleIDButton()
        button.addTarget(self, action: #selector(appleIDLogin), for: .touchUpInside)
        self.appleLoginStackView.addArrangedSubview(button)
    } else {
        self.showToast(message: "애플 로그인은 iOS13 이상부터 사용이 가능합니다.")
        
    }
      
}
 
cs

버튼 클릭 시 실행될 함수는 다음과 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    @objc
    func appleIDLogin() {
        if #available(iOS 13.0*) {
            let appleIDProvider = ASAuthorizationAppleIDProvider()
            let request = appleIDProvider.createRequest()
            request.requestedScopes = [.fullName, .email]
                  
            let authorizationController = ASAuthorizationController(authorizationRequests: [request])
            authorizationController.delegate = self
            authorizationController.presentationContextProvider = self
            authorizationController.performRequests()
        } else {
            // 구버젼 아이폰 유저들에게..
        }
      
    }
    
cs

extension을 이용해 다음과 같이 설정합니다. 코드에서 보시다시피, 원하는 뷰 컨트롤러로 이동하는 코드를 구성할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
 
extension ViewController: ASAuthorizationControllerDelegate {
    @available(iOS 13.0*)
    func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
    if let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential {
        // Create an account in your system.
        let userIdentifier = appleIDCredential.user
        let userFirstName = appleIDCredential.fullName?.givenName
        let userLastName = appleIDCredential.fullName?.familyName
        let userEmail = appleIDCredential.email
        let jwt = appleIDCredential.identityToken
        
        
        print(userIdentifier)
        print(userFirstName)
        print(userLastName)
        print(userEmail)
        print(jwt?.base64EncodedString())
 
        // 아이디 결과를 통해 원하는 뷰컨트롤러로 이동하시면 됩니다.
        
        
    } else if let passwordCredential = authorization.credential as? ASPasswordCredential {
        // Sign in using an existing iCloud Keychain credential.
        let username = passwordCredential.user
        let password = passwordCredential.password
        
        print(username)
        print(password)
        //Navigate to other view controller
    }
  }
  
    @available(iOS 13.0*)
    func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
    // handle Error.
  }
}
 
extension ViewControllerKakaoLogin: ASAuthorizationControllerPresentationContextProviding {
    @available(iOS 13.0*)
    func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {
        return self.view.window!
    }
}
cs

댓글