Reputation: 2803
I'm using the google api for ios for signing in to the mobile app (taken from here: https://developers.google.com/identity/sign-in/ios/backend-auth They are showing there how to use objective-c to make a post request to the backend server and as a result - get the info if the token is valid or not.
I established my backend server properly and it verifies if the token is good or not (and it returns the status 200
or 401
. Now I just need to send the token from the app to my server and based on its result validate the user or not.
I found this answer about making post requests: https://stackoverflow.com/a/26365148/4662074
and following this example I coded it as follows:
// [START signin_handler]
func signIn(signIn: GIDSignIn!, didSignInForUser user: GIDGoogleUser!,
withError error: NSError!) {
if (error == nil) {
print("!!!! TOKEN !!!! "+user.authentication.idToken)
let request = NSMutableURLRequest(URL: NSURL(string: "http://mywebserver.com:3000/auth/token")!)
request.HTTPMethod = "POST"
let postString = "id_token="+user.authentication.idToken
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in
guard error == nil && data != nil else { // check for fundamental networking error
print("error=\(error)")
return
}
if let httpStatus = response as? NSHTTPURLResponse where httpStatus.statusCode != 200 { // check for http errors
print("statusCode should be 200, but is \(httpStatus.statusCode)")
print("response = \(response)")
}
let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
print("responseString = \(responseString)")
print("Signed in as a user: "+user.profile.name)
}
task.resume()
let sb = UIStoryboard(name: "Main", bundle: nil)
if let tabBarVC = sb.instantiateViewControllerWithIdentifier("TabController") as? TabController {
self.window!.rootViewController = tabBarVC
}
} else {
print("\(error.localizedDescription)")
}
}
// [END signin_handler]
Ok, in this case right after making a call to the webservice I'm switching the view to the main page of the app:
let sb = UIStoryboard(name: "Main", bundle: nil)
if let tabBarVC = sb.instantiateViewControllerWithIdentifier("TabController") as? TabController {
self.window!.rootViewController = tabBarVC
}
But since I'm doing it right after task.resume()
- that means I'm never waiting for the result from the webservice and even if it states 401
- user is still signed it. I tried to put that piece of code above the task.resume()
but then I'm getting error:
This application is modifying the autolayout engine from a background thread, which can lead to engine corruption and weird crashes. This will cause an exception in a future release.
So how can I include the answer from my webservice during the logging in process and if the status is 200
- then switch the view to my TabController
? (and in other cases for example ask the user to log in again)
Upvotes: 1
Views: 929
Reputation: 285260
Tell, don't wait.
The request works asynchronously, so instantiate you controller in the completion block on success. To avoid the auto layout engine
message you have to do that on the main thread.
...
print("Signed in as a user: "+user.profile.name)
dispatch_async(dispatch_get_main_queue()) {
let sb = UIStoryboard(name: "Main", bundle: nil)
if let tabBarVC = sb.instantiateViewControllerWithIdentifier("TabController") as? TabController {
self.window!.rootViewController = tabBarVC
}
}
}
task.resume()
} else { ... }
Upvotes: 1