2017-02-14 30 views
0

Я работаю с google signIn Api, когда я нажимаю на свою кнопку входа в систему на моем первом представлении, я получил страницу веб-страницы google, я могу зарегистрировать себя и получить свои данные после того, как я использую fore для segue для доступа к второй вид. Когда я пытаюсь выйти из второго представления, он печатает мою строку «deco», и я возвращаюсь к своей первой странице. Но когда я пытаюсь войти себя снова, он врезаться с этой ошибкой:AppDelegate отправить ответ swift3

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'uiDelegate must either be a |UIViewController| or implement the |signIn:presentViewController:| and |signIn:dismissViewController:| methods from |GIDSignInUIDelegate|.'

Я думаю, что функция выхода из системы не работает, а также я не думаю, что использование performe для Segue в AppDelegate является лучшим Methode , вы делаете это с чем-то еще? (Ожидать уведомление)

Мой firstViewController

class ViewController: UIViewController, GIDSignInUIDelegate{ 

override func viewDidLoad() { 
    super.viewDidLoad() 
    GIDSignIn.sharedInstance().uiDelegate = self 
    // Do any additional setup after loading the view, typically from a nib. 
} 

@IBAction func btn(_ sender: Any) { 
    GIDSignIn.sharedInstance().signIn() 
}} 

На втором зрения у меня то же самое, только изменение GIDSignIn.sharedInstance(). Отключиться()

Мой AppDelegate содержат

class AppDelegate: UIResponder, UIApplicationDelegate, GIDSignInDelegate { 

var window: UIWindow? 


func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
    // Override point for customization after application launch. 
    var configureError : NSError? 
    GGLContext.sharedInstance().configureWithError(&configureError) 
    if (configureError != nil) 
    { 
      print("We have an error ! \(configureError)") 
    } 
    else 
    { 
     print("Google ready sir !") 

    } 
    GIDSignIn.sharedInstance().delegate = self 

    return true 
} 

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { 
    return GIDSignIn.sharedInstance().handle(
     url, 
     sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String, 
     annotation: options[UIApplicationOpenURLOptionsKey.annotation]) 
} 
func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) 
{ 
    if (error == nil) { 
     // Perform any operations on signed in user here. 
     let userId = user.userID     // For client-side use only! 
     let idToken = user.authentication.accessToken // Safe to send to the server 
     let fullName = user.profile.name 
     let givenName = user.profile.givenName 
     let familyName = user.profile.familyName 
     let email = user.profile.email 
     print("userId =>\(userId)") 
     print("idToken =>\(idToken)") 
     print("fullName =>\(fullName)") 
     print(" familyName=>\(familyName)") 
     print(" givenName=>\(givenName)") 
     print("email =>\(email)") 
     print("info => \(user.authentication)") 
     guard let rvc = self.window?.rootViewController as? ViewController 
      else { 
       return 
     } 
     rvc.performSegue(withIdentifier: "test", sender: nil) 



    } else { 
     print("\(error.localizedDescription)") 
    } 
} 



func sign(_ signIn: GIDSignIn!, didDisconnectWith user: GIDGoogleUser!, withError error: Error!) 
{ 
    print("Deco") 
} 
// Other func not usefull 

}

ответ

0

Похоже, вы указали оба своих ViewController и ваш AppDelegate как реализующий GIDSignInUIDelegate, но вы только положили реализацию в AppDelegate.

Вы должны решить, хотите ли вы реализацию в том или ином, и только объявлять поддерживаемый там протокол. Я предполагаю, что вы сбой, потому что ViewController фактический делегат:

GIDSignIn.sharedInstance().uiDelegate = self 

но не имеет необходимых методов. Если вы посмотрите на Google docs here, вы увидите, что он рекомендует реализовать в AppDelegate. Это содержит несколько шагов. Первым шагом является установка uiDelegate вместо вашего экземпляра AppDelegate. Что-то вроде:

GIDSignIn.sharedInstance().uiDelegate = UIApplication.shared.delegate as? GIDSignInUIDelegate 

Затем добавить реализацию:.

func signIn(signIn: GIDSignIn!, didSignInForUser user: GIDGoogleUser!, 
    withError error: NSError!) { 
    if (error == nil) { 
     // Perform any operations on signed in user here. 
     let userId = user.userID     // For client-side use only! 
     let idToken = user.authentication.idToken // Safe to send to the server 
     let fullName = user.profile.name 
     let givenName = user.profile.givenName 
     let familyName = user.profile.familyName 
     let email = user.profile.email 
     // ... 
    } else { 
     print("\(error.localizedDescription)") 
    } 
} 

func signIn(signIn: GIDSignIn!, didDisconnectWithUser user:GIDGoogleUser!, 
    withError error: NSError!) { 
    // Perform any operations when the user disconnects from app here. 
    // ... 
} 
+0

Когда я не пишу GIDSignIn.sharedInstance() uiDelegate = сам по моему мнению регулятора, я получил аварию с тем же сообщением, но я не могу войти даже один раз –

 Смежные вопросы

  • Нет связанных вопросов^_^