从ios扩展中检索谷歌用户

我正在尝试为我的应用程序创build一个共享扩展,该扩展需要从该扩展程序login到Google。 我已经设置了共享组钥匙串,并能够从主应用程序写入并读取扩展目标。 但是我无法通过扩展名loginGoogle,因为GIDSignIn.sharedInstance().hasAuthInKeychain()总是返回false。

有没有办法从一个扩展名login到谷歌,我该怎么做? 任何帮助,将不胜感激。

1.在Bridging-Header.h中

 import <GoogleSignIn/GoogleSignIn.h> import <Google/Core.h> 

2.在AppDelegate.swift中

 import Google 

application:didFinishLaunchingWithOptionslaunchOptions:configurationGGLContext对象:

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { var configureError: NSError? GGLContext.sharedInstance().configureWithError(&configureError) assert(configureError == nil, "Error configuring Google services: \(configureError)") GIDSignIn.sharedInstance().clientID = "client id" GIDSignIn.sharedInstance.shouldFetchBasicProfile = true GIDSignIn.sharedInstance().delegate = self } 

然后,将GIDSignInButton视图添加到您的应用程序。

最后,在视图控制器中,实现signIn:didSignInForUser:委托方法,当点击loginbutton时将被调用tapped:授权应用程序。

 - (void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user withError:(NSError *)error { // Perform any operations on signed in user here. // ... } 

3.在应用程序/扩展之间共享证书

当您login时,Google框架将不得不使用本机iOS方法将新凭据添加到iOS Keychain。 因此,他们将使用SecItemAdd(_:_:)方法将一个或多个项目添加到钥匙串。

要在应用程序和扩展程序中访问相同的钥匙串项目,您需要在项目设置中为Xcode的function部分中的应用程序和扩展程序启用“钥匙串共享”。 当你这样做时,Xcode可能会想更新你的应用程序ID和configuration文件,因为他们需要反映这个新的function。 您可能需要重新授权应用程序(步骤2)才能将凭据导入到正确的组中。

苹果文件明确指出:

如果您希望在多个应用程序之间共享新的钥匙串项目,请在属性字典中包含kSecAttrAccessGroup项目。 此键的值必须是所有将共享此项目的程序所属的钥匙串访问组的名称。

当您使用Xcode创build应用程序时,Xcode将应用程序标识符权利添加到应用程序包。 钥匙串服务使用此授权来授予应用程序访问其自己的钥匙串项目的权限。 您还可以向应用程序添加钥匙串访问组授权,并在授权属性列表文件中指定应用程序所属的钥匙串访问组数组。

4.我之前没有提到Google的额外提示。

请参阅“GoogleloginiOS版” 。 以下是使用GIDSignIn示例代码:

  1. 获取对GIDSignIn共享实例的引用: GIDSignIn *signIn = [GIDSignIn sharedInstance];
  2. 设置您要请求的OAuth 2.0范围: [signIn setScopes:[NSArray arrayWithObject:@"https://www.googleapis.com/auth/plus.login"]];
  3. 调用[signIn setDelegate:self];
  4. 设置委托方法signIn:didSignInForUser:withError:
  5. application:openUrl:调用共享实例的application:openUrl: …在您的应用程序委托中。
  6. 在共享实例上调用signIn ;

为此,您需要在项目的“function”窗格中启用Keychain Sharing 。 这将允许扩展和主应用程序共享密码。

苹果关于钥匙串共享的文档就在这里 。

直到现在还没有答案。 我最终使用Aerogear框架重写了Googlelogin。 现在我可以从主目标和扩展目标login。 这也解决了这个谷歌注销问题 。