22

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

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

4

3 回答 3

5

1. 在 Bridging-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. 在应用程序/扩展程序之间共享凭证

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

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

Apple 文档明确指出:

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

当您使用 Xcode 创建应用程序时,Xcode 会向应用程序包添加 应用程序标识符权利。Keychain Services 使用此权利授予应用程序访问其自己的钥匙串项的权限。您还可以向应用程序添加keychain-access-groups 权利,并在权利属性列表文件中指定应用程序所属的钥匙串访问组数组。

4. 我上面没有提到的来自谷歌的额外提示。

请参阅“iOS 版 Google 登录”。这是要使用的示例代码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. 在您的应用程序委托中从 ...调用handleURL共享实例。application:openUrl:
  6. 调用signIn共享实例;
于 2016-09-02T14:46:53.987 回答
0

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

于 2016-09-07T06:45:37.137 回答
0

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

Apple 关于钥匙串共享的文档在这里

于 2016-09-01T21:59:16.343 回答