带有Retrier的Alamofire refreshToken:如何获取refreshToken请求的状态并重新路由到LoginView

时间:2018-10-19 08:17:39

标签: swift alamofire

我根据Alamofire guide自定义refreshTokens函数。

当refreshTokens失败并从API服务器获得401状态时,我想重新路由到登录视图(对于其他错误状态,例如400或500,只需在视图中显示错误消息)。 目前,我使用UserDefaults来通知视图401状态(调用Alamofire请求)。

我想知道是否有更好的方法可以在视图中注意到“ refreshToken状态”(或与view和oauth2handler共享状态变量的方法)。

谢谢!

  • OAuth2Handler

        manager.request(urlString, method: .post, parameters: parameters, encoding: URLEncoding.default)
            .responseJSON { [weak self] response in
                guard let strongSelf = self else { return }
    
                if
                    let json = response.result.value as? [String: Any],
                    let accessToken = json["access_token"] as? String
                {
                    completion(true, accessToken)
                } else {
                    if let status = response.response?.statusCode, status == 401 {
                        UserDefaults.standard.set(true, forKey: "login_required")
    
                    }
                    completion(false, nil)
                }
    
                strongSelf.isRefreshing = false
        }
    
  • 单击某些按钮时的ViewController操作

    _ = client.request(API.addLike(json: comment))
        .subscribe(
            onSuccess: { (response) in
                // successful!
            },
            onError: { (err) in
                let loginRequired = UserDefaults.standard.bool(forKey: "login_required")
                if loginRequired == true {
                    print("refresh token is wrong or expired. login required")
                    // transition to LoginView
                } else {
                    print("request is invalid or server is down.")
                }
            }
        )
    

1 个答案:

答案 0 :(得分:1)

我最近为我的一个应用程序处理了相同的情况。我创建了一个OAuthManager类,该类继承自RequestAdapterRequestRetrier

func adapt(_ urlRequest: URLRequest) throws -> URLRequest中,我用Authorization令牌调整了请求。

func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion)中,我正在检查请求的结果,然后再发送到Alamofire的完成处理程序。

就我而言,我可以收到401错误代码以获取过期的访问令牌,或者仅仅是因为用户无权执行此操作。因此,我正在检查REST API发送的服务器消息,以确保访问令牌已过期并请求一个新令牌。

如果刷新令牌API返回错误,请执行以下操作,直接从should函数中显示LoginViewController:

let rootViewController = UIStoryboard(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "WELCOME_NAVIGATION")
UIApplication.shared.keyWindow?.rootViewController = rootViewController

我可以这样做,因为我的登录方法可从UIViewController获得。如果您想使用UIView,则可以将子视图添加到UIApplication.shared.keyWindow?.rootViewController.view

如果要显示通知或类似内容,最好使用NotificationCenter来触发UIView中的某些代码。

此致

IMACODE