diff --git a/DateSpot/DateSpot/Controller/LoginViewController.swift b/DateSpot/DateSpot/Controller/LoginViewController.swift index d46cbfb..0fc29d4 100644 --- a/DateSpot/DateSpot/Controller/LoginViewController.swift +++ b/DateSpot/DateSpot/Controller/LoginViewController.swift @@ -9,7 +9,7 @@ import UIKit import AuthenticationServices // Apple Login import GoogleSignIn // Google Login -class LoginViewController: UIViewController { +class LoginViewController: UIViewController, ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding { // MARK: - Properties // Google 로그인 버튼 @@ -34,7 +34,6 @@ class LoginViewController: UIViewController { // MARK: - Google /// Google 로그인 버튼 구성 및 레이아웃 설정 private func setupGoogleLoginButton() { - // 이미지 추가 let googleLogo = UIImage(named: "google") // 로컬 이미지 사용 googleButton.setImage(googleLogo, for: .normal) @@ -57,27 +56,89 @@ class LoginViewController: UIViewController { // MARK: - Apple /// Apple 로그인 버튼 구성 및 레이아웃 설정 private func setupAppleLoginButton() { - // Apple 버튼 Auto Layout 활성화 - authorizationAppleIDButton.translatesAutoresizingMaskIntoConstraints = false - authorizationAppleIDButton.addTarget(self, action: #selector(handleAuthorizationAppleIDButton(_:)), for: .touchUpInside) // 버튼 동작 설정 - view.addSubview(authorizationAppleIDButton) - - // Apple 버튼 제약 조건 설정 + let appleLoginButton = ASAuthorizationAppleIDButton(type: .signIn, style: .whiteOutline) + appleLoginButton.translatesAutoresizingMaskIntoConstraints = false + appleLoginButton.addTarget(self, action: #selector(handleAuthorizationAppleIDButtonPress), for: .touchUpInside) + + // 버튼을 화면에 추가 + self.view.addSubview(appleLoginButton) + + // 오토레이아웃 설정 NSLayoutConstraint.activate([ - authorizationAppleIDButton.centerXAnchor.constraint(equalTo: view.centerXAnchor), // 화면 중앙에 정렬 - authorizationAppleIDButton.topAnchor.constraint(equalTo: googleButton.bottomAnchor, constant: 20), // Google 버튼 아래로 20pt - authorizationAppleIDButton.widthAnchor.constraint(equalToConstant: 200), // 버튼 너비 200pt - authorizationAppleIDButton.heightAnchor.constraint(equalToConstant: 50) // 버튼 높이 50pt + appleLoginButton.centerXAnchor.constraint(equalTo: self.view.centerXAnchor), + appleLoginButton.centerYAnchor.constraint(equalTo: self.view.centerYAnchor), + appleLoginButton.heightAnchor.constraint(equalToConstant: 50), + appleLoginButton.widthAnchor.constraint(equalToConstant: 300) ]) } // MARK: - Selectors /// Apple 로그인 버튼 동작 처리 - @objc private func handleAuthorizationAppleIDButton(_ sender: ASAuthorizationAppleIDButton) { - print("Apple Login Button Tapped") - // 여기에 Apple 로그인 처리 로직 추가 + @objc func handleAuthorizationAppleIDButtonPress() { + let appleIDProvider = ASAuthorizationAppleIDProvider() + let request = appleIDProvider.createRequest() + request.requestedScopes = [.fullName, .email] // 사용자 이름과 이메일 요청 + + let authorizationController = ASAuthorizationController(authorizationRequests: [request]) + authorizationController.delegate = self // 결과 처리 delegate 연결 + authorizationController.presentationContextProvider = self // 현재 화면 context 제공 + authorizationController.performRequests() // 애플 로그인 요청 시작 + } + + // MARK: - ASAuthorizationControllerDelegate + /// Apple 로그인 인증 성공 처리 + func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) { + switch authorization.credential { + + case let appleIDCredential as ASAuthorizationAppleIDCredential: + let userIdentifier = appleIDCredential.user + let fullName = appleIDCredential.fullName + let email = appleIDCredential.email + + print("User Identifier: \(userIdentifier)") + print("Full Name: \(String(describing: fullName))") + print("Email: \(email ?? "None")") + + // UserDefaults에 사용자 정보 저장 + let defaults = UserDefaults.standard + + // 이름 저장 (Optional 처리) + if let givenName = fullName?.givenName, let familyName = fullName?.familyName { + let completeName = "\(givenName) \(familyName)" + defaults.set(completeName, forKey: "fullName") + print("Saved Full Name: \(completeName)") + } else { + defaults.set("", forKey: "fullName") // 이름이 없을 경우 빈 문자열 저장 + print("Saved Full Name as empty string") + } + + // 이메일 저장 + if let email = email { + defaults.set(email, forKey: "email") + print("Saved Email: \(email)") + } else { + defaults.set("", forKey: "email") // 이메일이 없을 경우 빈 문자열 저장 + print("Saved Email as empty string") + } + + default: + print("Apple Login did not return valid credentials.") + } + } + + /// Apple 로그인 인증 실패 처리 + func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) { + print("Apple Login Failed: \(error.localizedDescription)") + } + + // MARK: - ASAuthorizationControllerPresentationContextProviding + /// Apple 로그인 창을 표시할 윈도우 지정 + func presentationAnchor(for controller: ASAuthorizationController) -> ASPresentationAnchor { + return self.view.window! } + // MARK: - Google + /// Google 로그인 처리 @objc private func handleGoogleSignIn() { GIDSignIn.sharedInstance.signIn(withPresenting: self) { result, error in if let error = error { @@ -118,8 +179,4 @@ class LoginViewController: UIViewController { } } } - - - - -} // LoginViewController +}