gpt4 book ai didi

swift - Alamofire refreshToken 与 Retrier : how to get status of refreshToken request and reroute to LoginView

转载 作者:行者123 更新时间:2023-11-28 14:07:01 25 4
gpt4 key购买 nike

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

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

我想知道是否有更好的方法来通知 View 的“refreshToken 状态”(或与 View 和 oauth2handler 共享状态变量的方法)。

谢谢!

  • OAuth2处理程序

        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 Action

    _ = 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.")
    }
    }
    )

最佳答案

我最近在我的一个应用程序中遇到了同样的情况。我创建了一个 OAuthManager 类,它继承自 RequestAdapterRequestRetrier

func adapt(_ urlRequest: URLRequest) throws -> URLRequest 中,我使用我的 Authorization token 调整我的请求。

func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion) 我在发送到完成处理程序之前检查请求的结果阿拉莫菲尔。

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

如果刷新 token API 返回错误,我会直接从 should 函数显示 LoginViewController,方法是:

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

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

如果你想显示通知或类似的东西,也许最好使用 NotificationCenter 来触发你的 UIView 中的一些代码。

问候,

图像编码

关于swift - Alamofire refreshToken 与 Retrier : how to get status of refreshToken request and reroute to LoginView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52888398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com