최근 개발중인 앱을 Firebase과 연동하여 만들고 있는데,
구글로 로그인 하는 것에 꽤 애를 먹었다.
알고보니 Firebase도 그렇고 Swift도 그렇고 자주 바뀌어 해결하는게 쉽지 않았다.
공식 문서를 보며 작성을 잘 하였지만, 중간에 막히는 바람에..
차근차근 안내해주겠다.



  1. Authentication에서 Google을 활성화 시켜준다.
    프로젝트 지원 이메일은 자신의 이메일을 쓰면 되고, 다른 것은 건드리지 않으면 된다.


  2. Firebase와 프로젝트가 이미 연동이 되어 있어 Podfile이 있다는 가정하에 글을 쓰고 있다.
    Podfile에서 아래의 코드를 추가 해준다.
    pod 'Firebase/Auth'
    pod 'GoogleSignIn'
    




  3. AppDelegate와 자신의 로그인을 구현할 ViewController에 아래의 코드를 import 해준다.
import Firebase
import GoogleSignIn




  1. Firebase와 프로젝트를 연동하면서 그때 가져온 GoogleService-Info.plist 파일을 열어, REVERSED_CLIENT_ID 키를 복사하여 화면에 보이는 곳에 그대로 붙여넣어 준다.
    URL Schemes 이외에 다른 것들은 건드리지 않도록 한다.


  2. AppDelegate의 didFinishLauching 부분에 아래의 코드를 추가해준다.
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
         // Override point for customization after application launch.
         FirebaseApp.configure() // 이 한줄!
         return true
     }
    




  3. AppDelegate에서 아래의 코드를 추가해주자.
    나는 5번의 코드 바로 밑에다가 추가하였다.
@available(iOS 9.0, *)
    func application(_ application: UIApplication, open url: URL,
                     options: [UIApplication.OpenURLOptionsKey: Any])
      -> Bool {
      return GIDSignIn.sharedInstance.handle(url)
    }




  1. Storyboard에서 구글 로그인 버튼을 생성하고 ViewController에 추가를 해준다.
    (IBOutlet과 Action 두 형태로)
    Firebase 공식 문서에서는 버튼을 선언할 때, 아래의 형식으로 선언하라고 하였지만, 나는 signInButton이라 하면 다른 방법들과 구분하기 어려워 그냥 googleLogin이라고 이름을 설정하였지만 문제없이 잘 되었다.
    @IBOutlet weak var signInButton: GIDSignInButton!




마지막으로 내가 막혔던 부분이다.
구글 로그인을 한 정보를 바탕으로 Firebase에도 인증을 하여야 최종적으로 완성이 되는데, 이 부분의 코드를 공식 문서를 그대로 복사하여 붙여놓으니 되지 않았다.
아래의 코드를 이전 단계의 가장 밑 부분에 붙여놓으면 된다.
한 눈에 보기 쉽게 8번 과정의 코드와 함께 다시 적겠다.

guard let clientID = FirebaseApp.app()?.options.clientID else { return }
        // Create Google Sign In configuration object.
        let config = GIDConfiguration(clientID: clientID)
        // Start the sign in flow!
        GIDSignIn.sharedInstance.signIn(with: config, presenting: self) { [unowned self] user, error in
          if let error = error {
            // ...
            return
          }
          guard
            let authentication = user?.authentication,
            let idToken = authentication.idToken
          else {
            return
          }
          let credential = GoogleAuthProvider.credential(withIDToken: idToken,
                                                         accessToken: authentication.accessToken)
            // Firebase 로그인
            Auth.auth().signIn(with: credential) { authResult, error in
                if let error = error {
                    print("Firebase sign in error: \(error)")
                    return
                } else {
                    print("User is signed with Firebase&Google!")
                    self.changeView("Main", "ViewController")
                }
            }
        }




+) 마지막 줄의 self.changeView(“Main”, “ViewController”)는 로그인 성공시, View 변환을 위해 추가한 것이다. ChangeView 함수를 직접 만들었는데, 매우 유용하여 이에 대한 코드를 아래에 남겨둘테니 참고하면 좋을 듯 하다.

public func changeView(_ storyBoardName : String,_ viewControllerName : String)
    {
        let stb = UIStoryboard(name: storyBoardName, bundle: nil)
        let rootVC = stb.instantiateViewController(withIdentifier: viewControllerName)
        let snapshot = (UIApplication.shared.keyWindow?.snapshotView(afterScreenUpdates: true))!
        rootVC.view.addSubview(snapshot)

        UIApplication.shared.keyWindow?.rootViewController = rootVC
        UIView.transition(with: snapshot,
                          duration: 0.4,
                          options: .transitionCrossDissolve,
                          animations: {
                              snapshot.layer.opacity = 0
                          },
                          completion: { status in
                              snapshot.removeFromSuperview()
                          })
    }

태그:

카테고리:

업데이트:

댓글남기기