我使用谷歌sdk进行谷歌登录但输入电子邮件和密码后
在viewDidLoad中添加了委托
//设置Google登录代表
[GIDSignIn sharedInstance].delegate = self;
[GIDSignIn sharedInstance].uiDelegate = self;
-(void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user withError:(NSError *)error{
}
未调用。问题在哪里
当我输入用户电子邮件和密码时,我得到了这个
调用此方法并显示错误为空。
- (void)signInWillDispatch:(GIDSignIn *)signIn error:(NSError *)error {
}
答案 0 :(得分:2)
在AppDelegate.m文件中添加以下代码
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
return [[GIDSignIn sharedInstance] handleURL:url
sourceApplication:sourceApplication
annotation:annotation];
}
答案 1 :(得分:1)
AFAIK GIDSignIn
类有两个委托属性:
delegate
uiDelegate
在uiDeleagte
的协议中定义了未为您调用的方法。
答案 2 :(得分:1)
在GIDSignInUiDelegate
上调用get调用的方法,而在登录后在GIDSignInDelegate
上调用 not 调用的方法。以下是GIDSignIn头文件中的内容:
@protocol GIDSignInDelegate <NSObject>
- (void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user withError:(NSError *)error;
@protocol GIDSignInUIDelegate <NSObject>
@optional
- (void)signInWillDispatch:(GIDSignIn *)signIn error:(NSError *)error;
由于你已经将两者设置为uiDelegate和UIViewController实例的委托,因此应该调用这两种方法。
当我遇到同样的问题时,我的错误是,我还将AppDelegate设置为GIDSignInDelegate
,造成数小时的混乱!所以我的建议是:从登录返回时仔细检查你的ViewController是否仍然是delegate
的{{1}}。在被调用的回调中设置一个断点:
GIDSignIn.sharedInstance
答案 3 :(得分:0)
我遇到了一个非常类似的问题,直到意识到GIDSignInDelegate在启动登录和获取回调之间被垃圾收集。只是在其他地方存储对它的引用解决了我的问题。 (大概谷歌使用弱引用)
答案 4 :(得分:0)
我有同样的问题。我曾尝试像下面这样登录。
// GDrive.swift
import GoogleSignIn
import GoogleAPIClientForREST
class GDrive: NSObject,GIDSignInDelegate,GIDSignInUIDelegate
func signIn() {
GIDSignIn.sharedInstance().uiDelegate = self
GIDSignIn.sharedInstance().delegate = self
GIDSignIn.sharedInstance().scopes = scopes
GIDSignIn.sharedInstance().signIn()
}
func sign(inWillDispatch signIn: GIDSignIn!, error: Error!) {
print("Dispatch ")
}
func sign(_ signIn: GIDSignIn!, present viewController: UIViewController!)
{
print("Present View Controller")
}
func sign(_ signIn: GIDSignIn!, dismiss viewController: UIViewController!)
{
print("Dismiss View Controller")
}
public func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!)
{
print("Sign In")
}
}
//ViewController.swift
class MainVC: UIViewController {
func signInGDrive() {
let gClient:GDrive = GDrive() // this line has weak reference
gClient.signIn()
}
}
将gClient变量移至文件委托函数顶部后,已被调用。最终工作代码:
//ViewController.swift
class MainVC: UIViewController {
let gClient:GDrive = GDrive()
func signInGDrive() {
gClient.signIn()
}
}
感谢@akroy。