Google 具有 iOS 客户端的端点:用户每次都必须登录

Google Endpoints with iOS Client : User has to sign in every time

我正在开发一个使用 Google 端点 API 的 iOS 应用程序。为了授权请求,用户必须在第一个屏幕上使用他的 Gmail 帐户登录。我已经设法让它工作,但问题是用户每次启动应用程序时都必须登录。有没有办法让会话持续更长的时间?例如,当为 iOS 使用 Facebook SDK 时,一旦用户使用 Facebook 登录,会话将保持活动状态,直到用户明确注销。

谢谢,

我想出了我认为可以解决这个问题的技巧。

第1步:用户使用his/herGmail账号登录后,将认证对象属性保存到NSUserDefaults.

@objc(viewController:finishedWithAuth:error:)
    func finishedWithAuth(viewController :GTMOAuth2ViewControllerTouch , auth:GTMOAuth2Authentication,error:NSError!){

        self.dismissViewControllerAnimated(true, completion: nil);

        if error != nil {

            println("Authentication Failure: \(error.localizedDescription)");

        }else{

            GoogleEndpointAssistant.saveGTMOAuth2AuthenticationToUserDefaults(auth)

            setAuthentication(auth)

        }

GoogleEndpointAssistant.swift

class func saveGTMOAuth2AuthenticationToUserDefaults(auth : GTMOAuth2Authentication!){

            assert(auth.parameters != nil)
            assert(auth.parameters.count > 0)

            auth.parameters.setValue(auth.tokenURL.absoluteString, forKey: "token_url")
            auth.parameters.setValue(auth.redirectURI, forKey: "redirect_url")

            let defaults = NSUserDefaults.standardUserDefaults();
            defaults.setObject(auth.parameters, forKey: GMTOAuth2AuthenticationKey)

        }

步骤 2:在 viewDidLoad 中重建 auth 对象:

override func viewDidLoad() {

        if let auth : GTMOAuth2Authentication = GoogleEndpointAssistant.rebuildGTMOAuth2AuthenticationFromUserDefaults(){

            setAuthentication(auth)
        }

    }

GoogleEndpointAssistant.swift

class func rebuildGTMOAuth2AuthenticationFromUserDefaults()->GTMOAuth2Authentication?{

        let defaults = NSUserDefaults.standardUserDefaults();
        if let parameters  = defaults.dictionaryForKey(GMTOAuth2AuthenticationKey){

            let serviceProvider = parameters["serviceProvider"] as? String
            let tokenURL = NSURL(string:parameters["token_url"] as String)
            let redirectURL = parameters["redirect_url"] as String


            let auth : GTMOAuth2Authentication = GTMOAuth2Authentication.authenticationWithServiceProvider(
                serviceProvider,
                tokenURL: tokenURL,
                redirectURI: redirectURL,
                clientID: GoogleCloudEndPointClientID,
                clientSecret: GoogleCloudEndPointClientSecret) as GTMOAuth2Authentication

            auth.userEmail = parameters["email"] as String
            auth.userID = parameters["userID"] as String
            auth.userEmailIsVerified = parameters["isVerified"] as String
            auth.scope = parameters["scope"] as String
            auth.code = parameters["code"] as String
            auth.tokenType = parameters["token_type"] as String
            auth.expiresIn = (parameters["expires_in"] as NSNumber).longValue
            auth.refreshToken = parameters["refresh_token"] as String
            auth.accessToken = parameters["access_token"] as String

            return auth
        }
            return nil 
    }