我正在开发一个支持Google Sing In和Google App Invite的iOS Swift应用程序。为此,我使用GoogleSignIn v2.2.0,如下所示:

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 App Invite,这需要首先登录,因此我需要用户保持登录状态,这就是原因我从不叫GIDSignIn.sharedInstance().signOut()。如果我在登录后立即调用我的邀请方法,它将按预期方式打开邀请对话框,但我所面临的问题仅在我的应用程序重新启动并且GIDSignIn.sharedInstance().hasAuthInKeychain()返回始终为false时才会出现。所以我的问题是:从内存中释放应用程序之后是否可以将auth保留在钥匙串中,以后再使用它。如果不是,真正让我感到困惑的是signInSilently()方法,它看起来毫无意义。

最佳答案

我有同样的问题。但是,我发现了有关Google登录的意义。
我用不同的原始方法写了[[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的状态。

我希望这能帮到您。

10-08 06:58