포스트

Final (4)

Social Login

1. Google Login 구현

우선 firebase에서 구글을 추가.

CleanShot 2024-06-02 at 20 17 14@2x

그러면 새로운 plist파일을 주는데 그걸로 바꾼다.

이후 docs에 있는대로 진행을 하다보면

googlecloud에서 뭘 생성을 하는데 이부분을 사진을 찍지 못했다.

CleanShot 2024-06-02 at 20 21 58@2x

무튼 여기서 이렇게 클라이언트 id와, url스키마를 따로 적어둔다.

CleanShot 2024-06-02 at 20 23 58@2x

클라이언트 id를 info.plist에 추가.

CleanShot 2024-06-02 at 20 25 19@2x

Docs에서 AppDelegate에 인증 관련 메서드를 추가하라고 나와있어 해당 부분 추가

1
2
3
4
5
6
7
import GoogleSignIn

func application(_ app: UIApplication,
                     open url: URL,
                     options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
      return GIDSignIn.sharedInstance.handle(url)
    }

우선은 틀만 잡기 위해서

vm을 이렇게 해두었다.

1
2
3
4
5
6
7
8
9
10
11
12
func googleLoginDidTapped(presentViewController: UIViewController) {
        GIDSignIn.sharedInstance.signIn(withPresenting: presentViewController) { [weak self] signInResult, error in
            if let error = error {
                self?.loginPublisher.send(completion: .failure(error))
            }
            
            guard let result = signInResult else { return }
            self?.loginPublisher.send()
            print(result.user.userID)
            print(result)
        }
    }

물론 구글은 vc가 필요해서 프로토콜을 다음과 같이 한다.

1
2
3
4
5
protocol LoginInput {
    func appleLoginDidTapped ()
    func kakaoLoginDidTapped ()
    func googleLoginDidTapped (presentViewController: UIViewController) // added
}

그다음은 sceneDelegate 설정

1
2
3
4
5
6
7
8
9
10
11
var greetingVC = GreetingViewController()
        
        greetingVC = GreetingViewController(
            appleTapped: { [weak signViewModel] in
               signViewModel?.appleLoginDidTapped()
            }
            ,kakaoTapped: { [weak signViewModel] in
                signViewModel?.kakaoLoginDidTapped()
            }, googleTapped: { [weak signViewModel] in
                signViewModel?.googleLoginDidTapped(presentViewController: greetingVC)}
            , viewModel: signViewModel)

지금은 이렇게 했지만

처음에는

1
2
3
4
5
6
7
8
9
10
let greetingVC = GreetingViewController(
            appleTapped: { [weak signViewModel] in
               signViewModel?.appleLoginDidTapped()
            }
            ,kakaoTapped: { [weak signViewModel] in
                signViewModel?.kakaoLoginDidTapped()
            }, googleTapped: { [weak signViewModel] in
                
                signViewModel?.googleLoginDidTapped(presentViewController: GreetingViewController())}
            , viewModel: signViewModel)

여기에다가 이렇게 했다.

당연히 vc가 같을지언정 메모리는 다르기에 버튼누르면 카카오와같이 창은 뜨나 계속을 누를수도 없이 바로 사라지는 문제가 발생했다.

처음에는 찾아보다가 GPT에게 도움을 요청하였으나, 해결이 안되었다.

그러다가 vc를 인스턴스화할때 처음부터 이렇게 init을 안해도 생성이 된다는게 생각이나서

위와 같이 하였고 성공.

Jun-02-2024 23-39-03

네이버는 objective-c라 안하는게 좋을듯 하다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.