2015-08-28 139 views
3

我正在開發一個iOS Swift應用程序,它可以讓Google Sing In和Google App Invite。要做到這一點我使用GoogleSignIn V2.2.0如下:GIDSignIn驗證鑰匙串未保存

func loginRequest(onSuccess successBlock:() -> Void, onError errorBlock: (String?) -> Void) { 

    var signIn = GIDSignIn.sharedInstance() 
    signIn.shouldFetchBasicProfile = true 
    signIn.allowsSignInWithWebView = false 
    signIn.allowsSignInWithBrowser = true 
    signIn.scopes = ["https://www.googleapis.com/auth/plus.login"] 
    signIn.delegate = self 

    if signIn.hasAuthInKeychain(){ 
     signIn.signInSilently() 
    }else{ 
     signIn.signIn() 
    } 

} 

func signIn(signIn: GIDSignIn!, didSignInForUser user: GIDGoogleUser!, withError error: NSError!) { 
    if (error == nil) { 
     // managing login data here    
     self.successBlock() 
    } else { 
     self.errorBlock(error.localizedDescription) 
    }  
} 

到這裏一切都按預期工作,我能夠成功登錄我需要什麼未來,如上所述,是使用需要先登錄的Google應用邀請,因此我需要用戶保持登錄狀態,這就是爲什麼我不會撥打GIDSignIn.sharedInstance().signOut()。如果我剛剛在登錄後調用我的邀請方法,它將按預期打開邀請對話框,但是我遇到的問題僅在我的應用重新啓動並且GIDSignIn.sharedInstance().hasAuthInKeychain()始終爲false時纔會發生。所以我的問題是:在應用程序從內存中釋放並在以後使用時,是否可以在鑰匙串中保留auth。如果不是真的讓我困惑的是signInSilently()這種看起來完全沒有意義的方法

回答

2

我有同樣的問題。不過,我發現有關Google Sign-In的一點。
我寫[[GIDSignIn sharedInstance] signIn];並在不同的原始方法[[GIDSignIn sharedInstance] signInSilently];

例如,

- (void)checkOAuth { 
    [GIDSignIn sharedInstance].uiDelegate = self; 
    if([GIDSignIn sharedInstance].hasAuthInKeychain) { 
     GIDGoogleUser *user = [GIDSignIn sharedInstance].currentUser; 
     if(!user) { 
      [[GIDSignIn sharedInstance] signInSilently]; 
     } 
    } 
} 

- (void)didReceivedLogin { 

    [GIDSignIn sharedInstance].uiDelegate = self; 
    [GIDSignIn sharedInstance].scopes = @[@https://www.googleapis.com/auth/drive"]; 
    // Google SignInを実行 
    [[GIDSignIn sharedInstance] signIn]; 

} 

不過,我可以通過固定代碼hasAuthInKeychain得到真實的。
首先,我改變了在ViewDidLoad方法中編寫GIDSignIn的新方法。 它在我的應用程序中統一了有關GIDSignIn的狀態。

我希望這會幫助你。