我正在关注官方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它看起来与我的问题有关,也许你们有人曾见过它?