runtime 自动刷新token

//
//  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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容