Google SignIn SFSafariViewController / WebView在接受权限后redirect到Google.com

我试图实现我使用Cocoapods安装的新的Google SignIn库。 部署目标是8.4和Im在9.0.2设备中testing。

1-我有适当的plist文件与clientID和reverseID

我有设置的urltypes

3-我有AppDelegate作为GIDSignIn的代理[GIDSignIn sharedInstance].delegate = self; - (void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user withError:(NSError *)error

我有- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [[GIDSignIn sharedInstance] handleURL:url sourceApplication:sourceApplication annotation:annotation]; } - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [[GIDSignIn sharedInstance] handleURL:url sourceApplication:sourceApplication annotation:annotation]; }

5 – 我使用自动GIDSignInButton类和放置在UIViewController的子类,所以我不需要实现GIDSignIn uiDelegate方法。 但是我仍然有[[GIDSignIn sharedInstance] setUiDelegate:self]; 在viewDidLoad中设置

6-我有链接库中的SFSafariViewController.framework。

我从来没有手动设置clientID为GIDSignIn,因为这不是谷歌的官方文档说明的一部分。 虽然很多人一直这样做,我不知道为什么。

问题:一旦我按下loginbutton,一个SFSafariViewController得到呈现,我select我想要使用的帐户(注意,它永远不会出我的应用程序到任何其他谷歌应用程序进行身份validation,即使我有几个安装)。 权限得到呈现,我看到我在Google Developer Console中configuration的应用程序的名称和徽标,我接受权限。 SFSafariViewController退回到“www.google.com”,就是这样。 解除这个屏幕的唯一方法是点击- (void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user withError:(NSError *)error右上angular的“OK”button,然后- (void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user withError:(NSError *)error被调用,错误说使用取消login过程。

只要解决它。 正如你使用CocoaPods,似乎你必须设置

迅速:

  func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool { return GIDSignIn.sharedInstance().handleURL(url, sourceApplication: sourceApplication, annotation: annotation) } 

OBJ-C

 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [[GIDSignIn sharedInstance] handleURL:url sourceApplication:sourceApplication annotation:annotation]; } 

在你的appDelegate。 现在,您将在接受权限后redirect到您的应用程序。

更多信息: https : //developers.google.com/identity/sign-in/ios/sign-in

我发现了这个问题。 Google官方文档提到需要在AppDelegate中实现以下方法

 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [[GIDSignIn sharedInstance] handleURL:url sourceApplication:sourceApplication annotation:annotation]; } 

但是它从来没有提到需要实现一个类似的方法

 - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options 

我必须实现这两种方法才能使我的应用程序正常工作。 我也有Facebook身份validation,所以我的方法结束了如下所示。

 - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options { return [[FBSDKApplicationDelegate sharedInstance] application:app openURL:url sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey] annotation:options[UIApplicationOpenURLOptionsAnnotationKey]] || [[GIDSignIn sharedInstance] handleURL:url sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey] annotation:options[UIApplicationOpenURLOptionsSourceApplicationKey]]; } - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [[FBSDKApplicationDelegate sharedInstance] application:application openURL:url sourceApplication:sourceApplication annotation:annotation ] || [[GIDSignIn sharedInstance] handleURL:url sourceApplication:sourceApplication annotation:annotation]; }