Firebase Auth Google Sign In 연동 알아보기.
* 이글은 Swift 3.0 , Firebase 3.12.0, GoogleSignIn 4.0.1 을 기준으로 작성하였습니다.
먼저 Firebase console 에서 Auth 탭 -> Sign In 방법에서 구글을 활성화 하자.
XCode Project로 돌아와서 Podfile 에 pod 'GoogleSignIn' 를 추가하자
platform :ios, '10.0'
source 'https://github.com/CocoaPods/Specs.git'
target 'firebaseTEST' do
use_frameworks!
pod 'Firebase/Database'
pod 'Firebase/Auth'
pod 'GoogleSignIn'
pod 'FacebookCore'
pod 'FacebookLogin'
pod 'FacebookShare'
end
Firebase 설정단계에서 프로젝트에 추가한 GoogleService-Info.plist 파일의 내용을 보면
REVERSED_CLIENT_ID 가 있다.
Project 를 선택하고 -> Target -> Info 에서 URL Types 에 위 내용을 추가하자.
환경설정은 끝났다.
Appdelegate 에서 구글 SignIn 을 위한 클라이언트 ID를 넣어준다.
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
FIRApp.configure()
GIDSignIn.sharedInstance().clientID = FIRApp.defaultApp()?.options.clientID
return true
}
(* facebook Sign In openURL 도 같이 처리했다.)
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
if GIDSignIn.sharedInstance().handle(url,
sourceApplication: options[.sourceApplication] as? String,
annotation: options[.annotation]) {
return true
}else if FBSDKApplicationDelegate.sharedInstance().application(app,
open: url as URL!,
sourceApplication: options[.sourceApplication] as! String,
annotation: options[.annotation]) {
return true
}
return false
}
iOS 10 이하 버전을 위해 아래의 소스도 추가한다.
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
if GIDSignIn.sharedInstance().handle(url,
sourceApplication: sourceApplication,
annotation: annotation) {
return true
}else if FBSDKApplicationDelegate.sharedInstance().application(application,
open: url as URL!,
sourceApplication: sourceApplication,
annotation: annotation) {
return true
}
return false
}
delegate 를 설정한다.
import GoogleSignIn
class LoginViewController: UIViewController,GIDSignInDelegate, GIDSignInUIDelegate {
override func viewDidLoad() {
super.viewDidLoad()
GIDSignIn.sharedInstance().delegate = self
GIDSignIn.sharedInstance().uiDelegate = self
}
...
delegate 함수를 아래와 같이 작성.
func sign(_ signIn: GIDSignIn?, didSignInFor user: GIDGoogleUser?, withError error: Error?) {
if let error = error {
print(error.localizedDescription)
}
guard let authentication = user?.authentication else { return }
let credential = FIRGoogleAuthProvider.credential(withIDToken: authentication.idToken,
accessToken: authentication.accessToken)
FIRAuth.auth()?.signIn(with: credential) { (user, error) in
if let error = error {
print(error.localizedDescription)
}else {
}
}
}
/* optional
func signIn(signIn: GIDSignIn?, didDisconnectWithUser user:GIDGoogleUser?,
withError error: NSError?) {
}*/
GIDSignIn.sharedInstance().uiDelegate = self
let signInButton = GIDSignInButton()
signInButton.center = CGPoint(x: view.center.x,y: view.center.y - 50)
view.addSubview(signInButton)
*( Custom UIButton 을 사용한 Sign in)
GIDSignIn.sharedInstance().signIn() 만 불러 주면 된다.
하지만 Sign In을 진행해보고 콘솔로그를 자세히 보면,
<FIRAnalytics/INFO> Successfully created Firebase Analytics App Delegate Proxy automatically. To disable the proxy, set the flag FirebaseAppDelegateProxyEnabled to NO in the Info.plist
2016-08-23 20:36:28.090: <FIRInstanceID/WARNING> FIRInstanceID AppDelegate proxy enabled, will swizzle app delegate remote notification handlers. To disable add "FirebaseAppDelegateProxyEnabled" to your Info.plist and set it to NO
위와 같은 에러가 나온다.
에러에서 안내하는 해결방식대로 info.plist 에 아래와 같이 "FirebaseAppDelegateProxyEnabled" , "Boolean" 타입으로 추가하고 값을 "NO"로 설정하자.
자 이제 다시 테스트를 위해 위쪽 signIn 메서드 중간에 아래와 같이 추가하자.
FIRAuth.auth()?.signIn(with: credential) { [weak self] (user, error) in
print("google signIn")
func firebaseWriteTest(){
let ref = FIRDatabase.database().reference()
let itemsRef = ref.child("test")
itemsRef.setValue(["Name":"TilltueGoogle"])
}
firebaseWriteTest()
}
정상적으로 database 에 쓰이는 것을 확인 할 수 있다.
Firebase Console > Auth > 사용자 탭에서 유저를 관리할 수 있다.