2017-02-14 5 views
0

Google 로그인 페이지에서 내 첫 번째보기에 로그인 버튼을 클릭하면 Google 웹뷰 페이지가 표시됩니다. 액세스하려면 segue를 사용하여 performe를 사용하고 나 자신을 로그하고 내 데이터를 가져올 수 있습니다. 두 번째보기. 두 번째보기에서 로그 아웃하려고하면 "데코"문자열이 출력되고 첫 페이지로 돌아갑니다. 나는 다시 자신을 로그온 할 때, 그는이 오류와 충돌 : 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|.'

내가 로그 아웃 기능이 작동하지 않았다고 생각하고, 또한 내가 AppDelegate에에 SEGUE에 대한 사용 performe을 생각하지 않는 것이 가장 좋은 메도입니다 , 너는 다른걸로 만들어? 만 변화가 GIDSignIn.sharedInstance 인 내가 같은 일이 내 두 번째 관점에서

내 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() 
}} 

을 (알림 기대)(). 분리를()

내 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이고 AppDelegateGIDSignInUIDelegate을 구현하지만 사용자는 AppDelegate에만 구현을 넣습니다.

구현을 원하는지 여부를 결정하고 거기에서 지원되는 프로토콜 만 선언해야합니다.

GIDSignIn.sharedInstance().uiDelegate = self 

하지만 필요한 방법이없는 : 내 생각은 ViewController 실제 위임하기 때문에 당신이 충돌하는 것입니다. Google docs here을 보면 AppDelegate에 구현하는 것이 좋습니다. 여기에는 여러 단계가 포함됩니다. 첫 번째 단계는 대신 AppDelegate 인스턴스에 uiDelegate을 설정하는 것입니다. 뭔가 같은 :.

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

그런 다음 구현 추가 : 나는 GIDSignIn.sharedInstance를 작성하지 않는 경우

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

()를 내보기 컨트롤러에 uiDelegate = 자기, 내가 같은 메시지와 함께 충돌을 얻었다을, 하지만 나는 한 번도 기록 할 수 없다. –