我正在尝试为我的应用程序创建一个共享扩展程序,该扩展程序需要从扩展程序登录到 Google。我已经设置了共享组钥匙串,并且能够从主应用程序写入并读取扩展目标。但我无法从扩展程序登录 Google,因为GIDSignIn.sharedInstance().hasAuthInKeychain()
总是返回 false。
有什么方法可以从扩展程序登录到 Google,我该怎么做?任何帮助,将不胜感激。
我正在尝试为我的应用程序创建一个共享扩展程序,该扩展程序需要从扩展程序登录到 Google。我已经设置了共享组钥匙串,并且能够从主应用程序写入并读取扩展目标。但我无法从扩展程序登录 Google,因为GIDSignIn.sharedInstance().hasAuthInKeychain()
总是返回 false。
有什么方法可以从扩展程序登录到 Google,我该怎么做?任何帮助,将不胜感激。
import <GoogleSignIn/GoogleSignIn.h>
import <Google/Core.h>
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.
// ...
}
当您登录时,Google 框架将不得不使用原生 iOS 方法将新凭据添加到 iOS 钥匙串。因此,他们将使用SecItemAdd(_:_:)
将一个或多个项目添加到钥匙串的方法。
要在应用程序和扩展程序中访问相同的钥匙串项,您需要在项目设置的Xcode 功能部分中为应用程序和扩展程序启用“钥匙串共享”。当您这样做时,Xcode 可能会想要更新您的应用程序 ID 和配置文件,因为它们需要反映这种新功能。您可能必须重新授权应用程序(第 2 步)才能将凭据放入正确的组。
Apple 文档明确指出:
如果您希望在多个应用程序之间共享新的钥匙串项,请在属性字典中包含 kSecAttrAccessGroup 键。此键的值必须是共享此项目的所有程序所属的钥匙串访问组的名称。
当您使用 Xcode 创建应用程序时,Xcode 会向应用程序包添加 应用程序标识符权利。Keychain Services 使用此权利授予应用程序访问其自己的钥匙串项的权限。您还可以向应用程序添加keychain-access-groups 权利,并在权利属性列表文件中指定应用程序所属的钥匙串访问组数组。
请参阅“iOS 版 Google 登录”。这是要使用的示例代码GIDSignIn
:
GIDSignIn
共享实例的引用:GIDSignIn *signIn = [GIDSignIn sharedInstance];
[signIn setScopes:[NSArray arrayWithObject:@"https://www.googleapis.com/auth/plus.login"]];
[signIn setDelegate:self];
signIn:didSignInForUser:withError:
。handleURL
共享实例。application:openUrl:
signIn
共享实例;直到现在都没有答案。我终于用Aerogear 框架重写了谷歌登录。现在我可以从主目标和扩展目标登录。这也解决了这个谷歌注销问题。
为此,您需要Keychain Sharing
在项目的“功能”窗格中启用。这将允许扩展程序和主应用程序共享密码。
Apple 关于钥匙串共享的文档在这里。