๐ง ์งํํ๋ ํ ์ด ํ๋ก์ ํธ์์ ๋ก๊ทธ์ธ ๊ตฌํ์ ๊ตฌ๊ธ ๋ก๊ทธ์ธ์ผ๋ก๋ง ๊ตฌ์ฑํ๋๋ฐ ์์ ๋ก๊ทธ์ธ ์ฌ์ฉ์ ์ ํ ๋ก๊ทธ์ธ์ ํ์๋ก ๋ฃ์ด์ผํ๋ค ํ๋๋ผ๊ณ ์! ๊ทธ๋์ ์ด๋ฒ์ ์ ํ ๋ก๊ทธ์ธ์ ๊ตฌํํ๋ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ ๋์ ์ฌ ๋ณผ๊นํฉ๋๋ค!
Step 1
์ ํ ๋ก๊ทธ์ธ์ ๊ตฌํํ๋ ค๋ฉด ์ ํ ๊ฐ๋ฐ์๊ฐ ๋ฑ๋ก๋ ์์ด์ผํฉ๋๋ค! Apple Developer์์ Account์์ Certificates, Identifiers & Profiles -> Identifiers ๋ก ๊ฐ์ ๋ค์ ํด๋น ์ฑ์์ Sign in with apple์ ์ฒดํฌํฉ๋๋ค.
Step 2
Signing & Capabilities์์ + Capability๋ฅผ ๋๋ฌ Sign in with Apple์ ์ถ๊ฐํด์ค์๋ค.
Step 3
AuthenticationServices์ import ํด์ค๋๋ค.
import UIKit
import AuthenticationServices
class ViewController: UIViewController {
...
}
Step 4
ASAuthorizationAppleIDButton์ ์ถ๊ฐํด์ค๋๋ค(์๋ ์ฝ๋์์ layout ๊ตฌ์ฑ์ ํ๋๋ฐ SnapKit์ ์ฌ์ฉํ์ต๋๋ค.).
import UIKit
import AuthenticationServices
import SnapKit
class ViewController: UIViewController {
override func loadView() {
self.view.addSubview(appleLoginButton)
appleLoginButton.snp.makeConstraints {
make.height.equalTo(50)
make.leading.equalToSuperview().offset(20)
make.trailing.equalToSuperview().offset(-20)
make.centerY.equalToSuperview()
}
}
...
private lazy var appleLoginButton: ASAuthorizationAppleIDButton = {
let button = ASAuthorizationAppleIDButton()
button.addTarget(self, action: #selector(appleLogin), for: .touchUpInside)
return button
}()
}
Step 5
ASAuthorizationControllerDelegate์ ASAuthorizationControllerPresentationContextProviding ๋ฅผ ์ฑํํด์ฃผ๊ณ ์๊ตฌ๋๋ ๋ฉ์๋์ธ ๋ฉ์๋๋ฅผ ์๋ ์์ ์ฝ๋์ ๊ฐ์ด ์ถ๊ฐํด์ค๋๋ค.
...
extension LoginViewController: ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding {
func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
switch authorization.credential {
case let appleIDCredential as ASAuthorizationAppleIDCredential:
let accessToken = String(data: appleIDCredential.identityToken!, encoding: .ascii) ?? ""
//TODO: Send ID token to backend.
print("Token: \(accessToken)")
default:
break
}
}
func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
print("Error: \(error.localizedDescription)")
}
func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor {
return self.view.window!
}
}
Step 6
๋ฒํผ ์ก์ ์ ์์ฑํด ์ฃผ์ ์ผํฉ๋๋ค.
class ViewController: UIViewController {
...
@objc private func appleLogin() {
let appleIDProvider = ASAuthorizationAppleIDProvider()
let request = appleIDProvider.createRequest()
request.requestedScopes = [.fullName]
let authorizationController = ASAuthorizationController(authorizationRequests: [request])
authorizationController.delegate = self
authorizationController.presentationContextProvider = self
authorizationController.performRequests()
}
}
...
์ฌ๊ธฐ๊น์ง๊ฐ Apple ๋ก๊ทธ์ธ ๊ธฐ๋ณธ์ ์ธ ๊ตฌํ์ด์์ต๋๋ค. ๊ตฌํํ ํ ๋๋ ์๋ฌธ์ด ์ฌ์ฉ์๊ฐ Apple ์์ฒด์ ์ผ๋ก ์ฐ๋ฆฌ ์ฑ์ ๋ํด Apple ID ์ฌ์ฉ ์ค๋จ์ ํด๋ฒ๋ฆฌ๋ฉด ์ฐ๋ฆฌ ์๋ฒ์์๋ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ค์ ์ด๋ป๊ฒ ์ง์ฐ์ง..?๐ค๐
์ข ๋ ๊ณ ๋ฏผํ๊ณ ๋ณด์ถฉํ๋ ๊ฑธ๋ก๐
๐ง(์๋ ์ฐธ๊ณ ๋ด์ฉ์ ํตํด ๋ ์์ธํ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค!)
Apple Developer