为什么hasAuthInKeychain()在使用他的Google帐户登录我的Swift应用程序的用户时并不总是返回true?

时间:2016-03-17 18:46:41

标签: ios swift appdelegate google-signin googlesigninapi

我正在关注官方google登录教程https://developers.google.com/identity/sign-in/ios/start?ver=swift并且我已经实现了它,但是我仍然面临一些基本错误。首先 - 谷歌建议在AppDelegate中完成所有这些工作。所以我把所有必要的方法都放在那里:

func application(application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        // Initialize sign-in
        var configureError: NSError?
        GGLContext.sharedInstance().configureWithError(&configureError)
        assert(configureError == nil, "Error configuring Google services: \(configureError)")

        GIDSignIn.sharedInstance().delegate = self

        return true
}

和另一个函数 - 因为我正在使用后端服务器来授权用户:

func signIn(signIn: GIDSignIn!, didSignInForUser user: GIDGoogleUser!,
    withError error: NSError!) {
        if (error != nil) {
            print("Looks like we have a sign in error: \(error)")
        }else {
            let tokenAsAParam = [
                "id_token":user.authentication.idToken
            ]

            NSNotificationCenter.defaultCenter().postNotificationName("ToggleAuthUINotification", object: nil, userInfo: ["statusText" : "Signed in user \(user)"])
            Alamofire.request(.POST, "http://mywebservice", parameters: tokenAsAParam)
                .response { (request, response, data, error) in
                    if(error != nil){
                        print("error during signing in with google= \(error)")
                        GIDSignIn.sharedInstance().signOut()
                    }else{

                        let sb = UIStoryboard(name: "Main", bundle: nil)
                        if let tabBarVC = sb.instantiateViewControllerWithIdentifier("TabController") as? TabController {
                            self.window!.rootViewController = tabBarVC

                        }

                    }
            }
            }
}

AppDelegate.swift中发生的一切。但是从那里我无法向用户显示等待来自我的webservice的响应(在将用户从ViewController移动到主TabController之前),所以到目前为止用例场景是如下:

1)用户打开应用并点击使用谷歌登录

2)用户输入Google凭据,点击确定

3)用户从点号回到页面。 1(谷歌登录按钮可见)

4)应用程序调用webservice,如果是肯定的结果,它会将用户转移到主TabController - 当互联网连接不佳时,这需要一些时间,然后用户感到困惑,因为他已经停留了一段时间屏幕从第1点和第3点开始。

我想表明某种迹象表明签约过程需要一些时间,用户应该等待。所以在ViewController的代码中我做了:

override func viewWillAppear(animated: Bool) {

GIDSignIn.sharedInstance().uiDelegate = self

if(GIDSignIn.sharedInstance().hasAuthInKeychain()){
        loadingIndicator.startAnimating()
        print("we are here")
        someView.hidden = false //this is my view that contains "please wait sign"
        GIDSignIn.sharedInstance().signInSilently()
    }else{
        print("we are there")
        someView.hidden = true
    }

它几乎可以使用,但在某些情况下GIDSignIn.sharedInstance().hasAuthInKeychain()的值为false,即使用户已登录。

例如:

当用户转动应用程序并且已经登录时 - 然后他会看到我的please wait弹出窗口,过了一会儿,他被重定向到TabController。 但是,如果用户未登录并点击Google按钮sign in with google,那么 - 在放置凭据后 - 该应用程序会使用该按钮返回到我的视图控制器,我可以在控制台中看到:we are there - 仍然,一段时间后用户转到TabController,看起来好像即使GIDSignIn.sharedInstance().hasAuthInKeychain()错了 - 他仍然能够登录。我认为这可能是一个错误,但此时我还不知道。你知道这里可能有什么问题吗?或者,您可以建议我如何在这种情况下呈现please wait消息吗?

========== EDIT 我刚刚发现了这个问题 - https://github.com/googlesamples/google-services/issues/27它看起来与我的问题有关,也许你们有人曾见过它?

0 个答案:

没有答案