我根据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.")
}
}
)
答案 0 :(得分:1)
我最近为我的一个应用程序处理了相同的情况。我创建了一个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发送的服务器消息,以确保访问令牌已过期并请求一个新令牌。
如果刷新令牌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