从 ios 扩展中检索谷歌用户

Posted

技术标签:

【中文标题】从 ios 扩展中检索谷歌用户【英文标题】:Retrieve google user from ios extension 【发布时间】:2017-01-01 12:35:24 【问题描述】:

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

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

【问题讨论】:

你需要使用Action扩展你不能在Share-扩展中这样做扩展有一些限制请参考这个链接----***.com/questions/35626898/… 嗯,我不确定。这里唯一的事情是谷歌框架如何处理钥匙串。但我会试一试。谢谢 【参考方案1】:

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's Capabilities 部分为应用程序和扩展程序启用“钥匙串共享”。当您这样做时,Xcode 可能会想要更新您的应用程序 ID 和配置文件,因为它们需要反映这种新功能。您可能需要重新授权应用(第 2 步),才能将凭据放入正确的组中。

Apple Documentation 明确指出:

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

当您使用 Xcode 创建应用程序时,Xcode 会添加一个 application-identifier 对应用程序包的授权。钥匙链 服务使用此权利授予应用程序访问其 自己的钥匙扣物品。您还可以添加 keychain-access-groups 应用程序的权利,并且在权利属性列表中 文件,指定钥匙串访问组的数组, 应用程序所属。

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

请参阅"Google Sign-In for iOS"。 这是使用GIDSignIn的示例代码:

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

【讨论】:

感谢您的回答。但第 3 节无关紧要。我确实启用了共享钥匙串,但问题是 GIDSignIn 不知何故在共享扩展中没有凭据。有没有办法覆盖 GIDSignIn 的钥匙串行为? 如果您打算使用 Google Plus 登录而不是 Google 登录,有一种方法。 GPPSignIn 将凭据保存在钥匙串中,但您可以在扩展程序和应用程序中调用 .keychainName 来指定要从中检索凭据的同一组。无论如何,要刷新令牌并授予对扩展程序的访问权限,您需要调用 signInSilently(或在 GPPSignIn 中等效)。如果我发现任何其他特定于 GIDSIgnIn 的内容,我会通知您。 通过 GIDSignIn 我可以使用这个GIDSignIn.sharedInstance().setValue(kGoogleClientKeychainname, forKey: "_keychainName") //GIDSignIn._keychainName。但这根本没有帮助。 Google+ 登录也已弃用 @sahara108,请参阅 developers.google.com/+/mobile/ios/sign-in 自 GIDSignIn 5.0.0 以来,钥匙串共享仍然是一种选择吗? GIDSignIn 似乎没有写入钥匙串或至少指定它。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

直到现在都没有答案。我终于用Aerogear framework重写了谷歌登录。现在我可以从主目标和扩展目标登录。这也修复了这个google logout issue。

【讨论】:

以上是关于从 ios 扩展中检索谷歌用户的主要内容,如果未能解决你的问题,请参考以下文章

使用谷歌应用脚​​本从电子表格数据中检索行

在IOS中检索谷歌地图当前位置时隐藏蓝点

谷歌计划禁止从第三方网站安装 Chrome 扩展程序

如何从公共谷歌电子表格中检索简单的xml

怎么在谷歌浏览器中安装.crx扩展名的离线Chrome插件?

怎么在谷歌浏览器中安装.crx扩展名的离线Chrome插件?