从 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
:
的示例代码
- 获取对
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
;
到现在还没有答案。我终于使用 Aerogear framework. Now I can able to login from both main target and extension target. This also fix this google logout issue.
重写了 Google 登录
我正在尝试为我的应用程序创建一个共享扩展程序,它需要从该扩展程序登录 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
:
- 获取对
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
;
到现在还没有答案。我终于使用 Aerogear framework. Now I can able to login from both main target and extension target. This also fix this google logout issue.
重写了 Google 登录