39113


初めての投稿で至らぬ点もございますがご了承いただけたら幸いです。  
GoogleのFirebaseを使ってログイン機能を実装しており、現在ログインしているユーザーがいる場合の処理（`Auth.auth().currentuser
!= nil
{}`）といったものを書いていたところ、まったくcurrentuserがnilになりません。もしかしたらほんとにおバカさんな発言なのかもしれませんが、恥ずかしながら初心者で大真面目です。

グーグルサインインのボタンを押したらサインインしながら画面遷移して、  
それ以外のボタンを押したらサインインをしない状態のまま画面遷移という実装をしたいです。

どなたかご教授お願いいたします。

以下コードです。

AppDelegate.swift

[code]

    import UIKit
    import Firebase
    import GoogleSignIn
    
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate,GIDSignInDelegate {
    
        var window: UIWindow?
    
    
        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    
            FirebaseApp.configure()
            GIDSignIn.sharedInstance().clientID = FirebaseApp.app()!.options.clientID
            GIDSignIn.sharedInstance().delegate = self
    
            let user = Auth.auth().currentUser
            if user != nil {
                user?.delete(completion: nil)
            }
    
    //      初回起動のUserDefault群
            let defaults = UserDefaults.standard
            let HomeDic = ["HomeFirstPop": true]
            defaults.register(defaults: HomeDic)
            let MapDic = ["MapFirstPop": true]
            defaults.register(defaults: MapDic)
            let SearchDic = ["SearchFirstPop": true]
            defaults.register(defaults: SearchDic)
            let RankDic = ["RankFirstPop": true]
            defaults.register(defaults: RankDic)
            let MypageDic = ["MypageDic": true]
            defaults.register(defaults: MypageDic)
            return true
    
        }
    
        func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
            return GIDSignIn.sharedInstance().handle(url,sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String, annotation: options[UIApplicationOpenURLOptionsKey.annotation])
        }
    
        func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {
            if let error = error {
                print("Error: \(error.localizedDescription)")
                return
            }
            let authentication = user.authentication
            let credential = GoogleAuthProvider.credential(withIDToken: (authentication?.idToken)!, accessToken: (authentication?.accessToken)!)
            Auth.auth().signIn(with: credential, completion: { (user, error) in
                print("You could signin with google")
            })
        }
    
        func sign(_ signIn: GIDSignIn!, didDisconnectWith user: GIDGoogleUser!, withError error: Error!) {
            print("Sign off successfully")
        }
    
    }
    
[/code]

SigninViewController

[code]

    import UIKit
    import Firebase
    import FirebaseAuth
    import FirebaseDatabase
    import GoogleSignIn
    
    class SignInViewController: UIViewController, GIDSignInUIDelegate {
    
        var userRef: DatabaseReference!
        let thisUser = ""
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            GIDSignIn.sharedInstance().uiDelegate = self
    
            userRef = Database.database().reference().child("users")
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
    
    
    //  サインインのときに呼び出されるメソッド。必須メソッド
        @IBAction func signinWithGoogle(_ sender: GIDSignInButton) {
            GIDSignIn.sharedInstance().signIn()
            GIDSignIn.sharedInstance().signIn()
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let nextView = storyboard.instantiateViewController(withIdentifier: "nextView") as! UITabBarController
            nextView.selectedIndex = 2
            self.present(nextView, animated: false, completion: nil)
        }
    
    
    
    // ログアウトボタンからログイン画面に戻ってくるためのメソッド
        @IBAction func backToTop(segue: UIStoryboardSegue) {
            GIDSignIn.sharedInstance().signOut()
    
        }
    
        @IBAction func NoSignInButton(_ sender: Any) {
    
            if Auth.auth().currentUser != nil {
                print("サインインしてるよ")
                print(Auth.auth().currentUser as Any)
            } else {
                let NextTabbarController = self.storyboard?.instantiateViewController(withIdentifier: "nextView") as! UITabBarController
    
                NextTabbarController.selectedIndex = 2
                self.present(NextTabbarController, animated: false, completion: nil)
            }
        }
    
    }
    
[/code]


CC BY-SA 3.0
2017-10-28T14:47:08.460
39108
2017-10-29T02:52:31.263
2017-10-28T16:00:32.803
3068
25959
question
firebase
firebaseのauthenticationについて困っています


初期化したすぐの状態ではcurrentUserはnilなので準備ができたかを確認するには  
認証状態をlistenする必要があります。  
次のドキュメントを参照してください。

<https://firebase.google.com/docs/auth/ios/start#listen_for_authentication_state>

addStateDidChangeListenerはログインされていなければcallback引数のuserがnilで呼び出され、ログインしていればオブジェクトが入っています。

addStateDidChangeListenerのcallbackが呼び出されるまではローディング画面を表示しておくなどするとよいでしょう。


CC BY-SA 3.0
2017-10-29T02:52:31.263
39113
2017-10-29T02:52:31.263
2260
39108
answer