BBAAPIRequestManager.h 5.46 KB
//
//  BBAAPIRequestManager.h
//  BBAPods
//
//  Created by mengxiangping on 16/10/11.
//  Modified by cairui01 on 18/3/15
//  Copyright © 2016年 Baidu. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "BBABaseAPIRequest.h"
#import "BBAAPIRequestInterface.h"
#import "BBAAPIReqUtils.h"
#import "BBANetworkProbeScheduler.h"

NS_ASSUME_NONNULL_BEGIN
@class AFHTTPSessionManager;

// 网络质量监控监听器
@protocol BBANetworkQualityListener <NSObject>
/**
 * 当有网络质量变化会回调此方法
 * @param networkQuality 网络质量状态值,取值范围APIREQUEST_GOOD_NETWORK_QUALITY,APIREQUEST_BAD_NETWORK_QUALITY,APIREQUEST_OFFLINE_NETWORK_QUALITY,APIREQUEST_UNKNOWN_NETWORK_QUALITY
 */
- (void)didNetworkQualityChange: (int)networkQuality;
@end

@protocol BBAAPIRequestInterceptor<NSObject>
- (NSInteger)level;
- (BOOL)shouldIntercept;
- (NSMutableURLRequest *)handleRequestWithURLRequest: (NSMutableURLRequest *)originalURLRequest;
@end

/**
 手百网络门面核心管理类
 */
@interface BBAAPIRequestManager : NSObject
/**
 * 用于判断网络门面是否支持QUIC协议
 */
@property (atomic, assign, readonly) BOOL quicEnable;
/**
 * 具备TurboNet能力的SessionConfig,订制需求高的选用这个config初始化Session
 */
@property (atomic, copy, readonly) NSURLSessionConfiguration * turboNetConfig __attribute__((deprecated("已废弃,请使用- (NSURLSessionConfiguration *)turbonetConfigWithConfig:(NSURLSessionConfiguration *)sessionConfiguration;")));

/**
 * 如果有自定义子类,通过此方法注册。
 * @param subClasses    子类列表,key 为 @(engineType),value 为类。
 * 注意:
 * 1. subClasses 中的类必须继承自 BBAAPIRequestManager 或其子类,engineType 不得与现有 engineType 重复;
 * 2. 该方法的调用的时机应尽可能早,且必须在 +(instancetype)sharedInstance 方法之前调用
 * 3. 子类需在.m 文件中 import BBAAPIRequestSubClassManager.h ,并按需求重载其中的方法,不要重载标明 Don't override 的方法。
 */
+ (void) registerSubClasses: (NSDictionary <NSNumber*, Class> *) subClasses;
+ (void) registerNetEngineType: (NetEngineType)type __deprecated; // TODO: 网络门面重构全量后,须移除
/**
 * 手百网络门面全局单实例
 * @return 单例实例
 */
+ (instancetype)sharedInstance;

+ (instancetype)sharedInstanceOfNewManager __attribute__((deprecated("已废弃,请使用+ (instancetype)sharedInstance")));; // TODO: 网络门面重构全量后,须移除
/**
 * 手百网络门面共享Session,如果开启TurboNet,将支持TurboNet能力,订制需求不高的选用此接口
 * @return NSURLSession实例
 */
- (NSURLSession*)sharedSession;

/**
 ClientIP
 */
@property (nonatomic, strong, readonly) NSString * clientIP;
- (void)parseResponseHeaderForClientIP:(NSDictionary*)headers;

#pragma mark 对外方法
//添加请求入队
- (void) enqueueAPIRequest:(BBABaseAPIRequest *)apiRequest;
//取消队中的请求
- (void) cancelAPIRequest:(BBABaseAPIRequest *)apiRequest;

//添加请求入自定义队列
- (void) enqueueAPIRequest:(BBABaseAPIRequest *)apiRequest intoQueue: (NSOperationQueue *) operationQueue;

#pragma mark - 数据打点
- (void) statisticsBusinessMetricsAction:(NSURLSessionTask *)sessionTask metrics: (NSDictionary *) metrics;

- (BOOL)statisticsBusinessTimeOutCaseWithError:(NSError *)error;

@property (atomic, assign, readonly) BOOL isWeakNet;
@property (nonatomic, copy) NSArray<NSString *> *quicDomains;
@property (atomic, assign, readonly) APIRequestQuicStatus quicStatus;
// 用来获取网络质量,参考常量值APIREQUEST_GOOD_NETWORK_QUALITY,APIREQUEST_BAD_NETWORK_QUALITY,APIREQUEST_OFFLINE_NETWORK_QUALITY,APIREQUEST_UNKNOWN_NETWORK_QUALITY
@property (atomic, assign, readonly) int networkQuality;
@property (nonatomic, strong) NSMutableDictionary* pingErrCode;
@property (nonatomic, strong) NSMutableDictionary* dnsErrCode;
@property (nonatomic, strong, readonly) NSDictionary<NSString *, NSNumber *> *dnsSubErrCode;
@property (nonatomic, strong, readonly) NSString *localDnsServerIpList;
@property (nonatomic, strong, readonly) NSString *localDnsServerIpUsed;
/**
 * 添加网络质量监听器
 * @param listener 要添加的网络质量监听器
 */
- (void)addNetworkQualityListener:(id <BBANetworkQualityListener>_Nonnull)listener;

/**
 * 移除网络质量监听器
 * @param listener 要移除的网络质量监听器
 */
- (void)removeNetworkQualityListener:(id <BBANetworkQualityListener>_Nonnull)listener;

/**
 * 异步对指定域名进行网络探测
 * @param host 需要探测的域名
 * @param completion 完成回调
 */
- (void)checkNetworkQualityOfHost:(NSString *)host completion:(NetQualityDiagnoseCallback)completion;

/**
 * 供业务方注册TurboNet初始化完成回调
 *(需要在TurboNet初始前注册,初始化需要时间,blk将在Turbo准备完成后调用一次)
 */
- (void)addUserTurboNetStartCallBack:(void(^_Nullable)(void))blk moduleName:(NSString*_Nullable)moduleName;
- (void)removeUserTurboNetStartCallBack:(NSString*_Nullable)moduleName;

- (NSURLSessionConfiguration *)turbonetConfigWithConfig:(NSURLSessionConfiguration *)sessionConfiguration;

/**
 * 添加请求拦截器
 * @param interceptor 要添加的请求拦截器
 */
- (void)addRequestInterceptor:(id <BBAAPIRequestInterceptor>)interceptor;

/**
 * 移除请求拦截器
 * @param interceptor 要移除的请求拦截器
 */
- (void)removeRequestInterceptor:(id <BBAAPIRequestInterceptor>_Nonnull)interceptor;

@end

NS_ASSUME_NONNULL_END