代码之家  ›  专栏  ›  技术社区  ›  simotunes

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

  •  0
  • simotunes  · 技术社区  · 7 年前

    guide .

    目前,我使用UserDefaults来通知视图的401状态(调用Alamofire请求)。

    我想知道是否有更好的方法来通知视图的“refreshToken status”(或者与视图和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 回复  |  直到 7 年前
        1
  •  1
  •   IMACODE    7 年前

    我最近为我的一个应用程序处理了同样的情况。我创造了一个 OAuthManager 继承自的类 RequestAdapter RequestRetrier .

    func adapt(_ urlRequest: URLRequest) throws -> URLRequest ,我将我的请求与 Authorization 代币。

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

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

    should 通过执行功能:

    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公司 .

    当做,