//
// AFURLSessionManager+AutoRefreshToken.m
// NWBQuotationBusinessModule_Example
//
// Created by Sendom on 15/5/18.
// Copyright © 2018年 lilonglong. All rights reserved.
//
#import "AFURLSessionManager+AutoRefreshToken.h"
#import <objc/runtime.h>
@implementation AFURLSessionManager (AutoRefreshToken)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Method originMethod = class_getInstanceMethod(self, @selector(dataTaskWithRequest:uploadProgress:downloadProgress:completionHandler:));
Method newMethod = class_getInstanceMethod(self, @selector(autoRefreshTokenDataTaskWithRequest:uploadProgress:downloadProgress:completionHandler:));
method_exchangeImplementations(originMethod, newMethod);
});
}
- (NSURLSessionDataTask *)autoRefreshTokenDataTaskWithRequest:(NSURLRequest *)request
uploadProgress:(nullable void (^)(NSProgress *uploadProgress)) uploadProgressBlock
downloadProgress:(nullable void (^)(NSProgress *downloadProgress)) downloadProgressBlock
completionHandler:(nullable void (^)(NSURLResponse *response, id _Nullable responseObject, NSError * _Nullable error))completionHandler {
void (^authFailBlock)(NSURLResponse *response, id responseObject, NSError *error) = ^(NSURLResponse *response, id responseObject, NSError *error)
{
NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
if([httpResponse statusCode] == 401){
//since there was an error, call you refresh method and then redo the original task
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
//call your method for refreshing OAuth tokens. This is an example:
[self refreshAccessToken:^(id responseObject) {
//store your new token
//
//now, queue up and execute the original task
NSURLSessionDataTask *originalTask = [self autoRefreshTokenDataTaskWithRequest:request uploadProgress:uploadProgressBlock downloadProgress:downloadProgressBlock completionHandler:completionHandler];
[originalTask resume];
}];
});
}else{
NSLog(@"no auth error");
completionHandler(response, responseObject, error);
}
};
return [self autoRefreshTokenDataTaskWithRequest:request uploadProgress:uploadProgressBlock downloadProgress:downloadProgressBlock completionHandler:authFailBlock];
}
- (void)refreshAccessToken:(void (^) (id responseObject))task {
}
@end
runtime 自动刷新token
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
相关阅读更多精彩内容
- 问题 一次面试遇到的一个问题,其实也是实际开发中很容易遇到的问题,特此记录一下。 当请求某个接口的时候,我们会在请...
- 在上篇文章Rxjava+Retrofit 实现全局过期 Token 自动刷新中,主讲了实现的思想,发布之后,有些小...
- 概述 Android端登陆接口获取一个token 和一个刷新token用的refresh_token,在接下来的t...
- 我们在做客户端的设计实现底层网络架构时候,常常不可避免的一个问题:token的有效验证,若是token过期,则需要...