从 ios 分机中检索 google 用户

Retrieve google user from ios extension

我正在尝试为我的应用程序创建一个共享扩展程序,它需要从该扩展程序登录 Google。我已经设置了共享组钥匙串,并且能够从主应用程序写入并读取扩展目标。但是我无法从分机登录到 Google,因为 GIDSignIn.sharedInstance().hasAuthInKeychain() 总是 returns false。

有什么方法可以从扩展程序登录 Google 吗?我该怎么做?任何帮助,将不胜感激。

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

Apple 关于钥匙串共享的文档是 here

1。在桥接中-Header.h

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

2。在AppDelegate.swift

import Google

application:didFinishLaunchingWithOptionslaunchOptions:中配置GGLContext对象:

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: 委托方法,当登录按钮为 tapped: 时,授权应用时将调用该方法。

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

3。在 apps/extensions

之间共享凭据

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

要在应用程序和扩展程序中访问相同的钥匙串项目,您需要在项目设置的 Xcode's Capabilities 部分为应用程序和扩展程序启用 "Keychain Sharing"。当您执行此操作时,Xcode 可能想要更新您的应用程序 ID 和配置文件,因为它们需要反映此新功能。您可能需要重新授权应用 (第 2 步) 才能将凭据放入正确的组。

Apple Documentation明确指出:

If you want the new keychain item to be shared among multiple applications, include the kSecAttrAccessGroup key in the attributes dictionary. The value of this key must be the name of a keychain access group to which all of the programs that will share this item belong.

When you use Xcode to create an application, Xcode adds an application-identifier entitlement to the application bundle. Keychain Services uses this entitlement to grant the application access to its own keychain items. You can also add a keychain-access-groups entitlement to the application and, in the entitlement property list file, specify an array of keychain access groups to which the application belongs.

4。来自 Google 的额外提示,我在上面没有提到。

请参阅"Google Sign-In for iOS"。 这是使用 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:... 在共享实例上调用 handleURL
  6. 在共享实例上调用 signIn

到现在还没有答案。我终于使用 Aerogear framework. Now I can able to login from both main target and extension target. This also fix this google logout issue.

重写了 Google 登录