google登录成功后不会调用委托方法

时间:2016-05-23 05:37:31

标签: ios objective-c iphone google-signin

我使用谷歌sdk进行谷歌登录但输入电子邮件和密码后

在viewDidLoad中添加了委托

//设置Google登录代表

    [GIDSignIn sharedInstance].delegate = self;
    [GIDSignIn sharedInstance].uiDelegate = self;

-(void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user withError:(NSError *)error{
}

未调用。问题在哪里

当我输入用户电子邮件和密码时,我得到了这个

enter image description here

调用此方法并显示错误为空。

- (void)signInWillDispatch:(GIDSignIn *)signIn error:(NSError *)error {

}

5 个答案:

答案 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。