Вход в Google не вызывает метод делегата после успеха

я использую google sdk для входа в google, но после ввода электронной почты и пароля

в 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 {

}

person Sport    schedule 23.05.2016    source источник
comment
Ты что-нибудь получил за это?   -  person UserDev    schedule 31.05.2016
comment
@Sport: ты решил это? у меня такая же проблема...   -  person Goodsquirrel    schedule 10.08.2016
comment
@Spot и Goodsquirrel, у меня такая же проблема, пожалуйста, дайте мне знать, исправили ли вы ее.   -  person Priyanka Singh    schedule 15.03.2017


Ответы (5)


Добавьте следующий код в файл AppDelegate.m

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{



    return [[GIDSignIn sharedInstance] handleURL:url
                               sourceApplication:sourceApplication
                                      annotation:annotation];
    }
person Hetal    schedule 23.05.2016

Метод, который вызывается get, вызывается в GIDSignInUiDelegate, а метод, который не вызывается, вызывается в GIDSignInDelegate после входа в систему. Вот что говорит заголовочный файл 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 из GIDSignIn.sharedInstance при возврате из входа. установите точку останова в обратном вызове, который вызывается:

- (void)signInWillDispatch:(GIDSignIn *)signIn error:(NSError *)error {
    if (GIDSignIn.delegate != self) {NSLog("gotcha!")}
}
person Goodsquirrel    schedule 10.08.2016

Класс AFAIK GIDSignIn имеет два свойства делегата:

  • delegate
  • uiDelegate

Метод, который не вызывается для вас, определен в протоколе uiDeleagte.

person Eimantas    schedule 23.05.2016

У меня была очень похожая проблема, пока я не понял, что GIDSignInDelegate собирает мусор между запуском входа и получением обратного вызова. Простое сохранение ссылки на него в другом месте решило мои проблемы. (предположительно Google использует слабую ссылку)

person Cannoliopsida    schedule 28.01.2018

У меня такая же проблема. Я попытался войти, как показано ниже.

// 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.

person Aybek Can Kaya    schedule 31.08.2019