//
// 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
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 问题 一次面试遇到的一个问题,其实也是实际开发中很容易遇到的问题,特此记录一下。 当请求某个接口的时候,我们会在请...
- 在上篇文章Rxjava+Retrofit 实现全局过期 Token 自动刷新中,主讲了实现的思想,发布之后,有些小...
- 概述 Android端登陆接口获取一个token 和一个刷新token用的refresh_token,在接下来的t...
- 我们在做客户端的设计实现底层网络架构时候,常常不可避免的一个问题:token的有效验证,若是token过期,则需要...