SMHttpDnsService.h 4.71 KB
//
//  SMHttpDnsService.h
//
//  Created by cairui01 on 15/6/3.
//  Copyright (c) 2015年 baidu. All rights reserved.
//
#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN
typedef NS_ENUM(NSInteger, SMHttpDnsErrorCode) {
    /**
     获取HTTPDNS IP失败,由于云端开关关闭
     */
    IpFailCloudClosedCode = 1,
    /**
     获取HTTPDNS IP失败,由于本地没有缓存
     */
    IpFailNoLocalCacheCode,
    /**
     获取HTTPDNS IP失败,由于本地缓存过期
     */
    IpFailLocalCacheExpirCode,
    
    /**
     未开启 HTTPDNS 服务.
     */
    IpFailNotUsedCode,
    
    /**
     IPv6 only
     */
    IpV6OnlyCode,
    
    /**
     无网络连接
     */
    NetworkNotReachable,
    
    /**
     阻塞主线程
     */
    BlockOnMainThread,
    
    /**
     非法域名
     */
    DomainInvalid,
    
    /**
     其他错误,详情可查看userInfo中的信息
     */
    SMHttpDnsErrorCodeOthers
};

typedef NS_OPTIONS(NSUInteger, BBAIpStack) {
    BBAIpStackNone = 0,
    BBAIpStackV4 = 1 << 0,
    BBAIpStackV6 = 1 << 1
};
const static BBAIpStack BBAIpStackDual = BBAIpStackV4 | BBAIpStackV6;

typedef NS_ENUM(NSUInteger, SMDNSResolveType) {
    SMDNSResolveTypeUnknown,
    SMDNSResolveTypeHTTPDNS,
    SMDNSResolveTypeLocalDNS,
    SMDNSResolveTypeBackupIP
};

typedef NS_ENUM(NSUInteger, SMDNSPolicy) {
    SMDNSPolicyV4Prefer, // 双栈下优选V4
    SMDNSPolicyV6Prefer, // 双栈下优选V6
    SMDNSPolicyHappyEyeball // HappyEyeball,暂不支持
};

FOUNDATION_EXPORT NSString *const kSMDNSResolveTypeKey;
FOUNDATION_EXPORT NSString *const SMHttpDnsErrorDomain;

typedef void(^SMHttpDnsCompletion)(NSArray<NSString *>* _Nullable result, NSError * _Nullable error, NSDictionary *info);

/**
 降级过滤器
 */
@protocol HttpDNSDegradationDelegate <NSObject>
/**
 是否允许HTTPDNS返回TTL过期的域名
 当您允许返回TTL过期的IP时,SDK在实时返回过期IP的同时依然会进行异步更新以获取最新的IP信息
 */
- (BOOL)shouldExpiredIPEnabled;
/**
 设置网络切换监听
 */
- (BOOL)isPreResolveAfterNetworkChanged;

@end

@protocol HttpDNSStatisticsDelegate <NSObject>

/**
 统计解析HTTPDNS成功
 */
- (void) statisticsParseDNSSuccessAction;
/**
 统计解析HTTPDNS失败
 */
- (void) statisticsParseDNSFailAction;

@end

@interface SMHttpDnsService : NSObject

@property (nonatomic, readonly) BOOL isIPv6; // 是否 IPv6-only
@property (nonatomic, readonly) BBAIpStack ipStack; // Ipv4/Ipv6/双栈
@property (nonatomic, assign) BOOL localDnsEnabled;
@property (nonatomic, copy, readonly) NSDictionary *userInfo;
@property (nonatomic, assign) SMDNSPolicy policy;
@property (nonatomic, copy, readonly) NSString *areaInfo;   //  HTTPDNS接口返回的地域.运营商信息,例如: "beijing.cmnet"
@property (nonatomic, assign, readonly) double lastAreaInfoUpdateTimestamp;   //  最近一次AreaInfo更新时间戳, areaInfo为空时为-1

- (BOOL)ipv6Reachable;
- (BOOL)ipv4Reachable;

/**
 获取HTTPDNS服务实例
 */
+ (instancetype)sharedInstance;
/**
 将app使用到的域名预设进来,以便于HTTPDNS进行预解析
 */
- (void)setPreResolveHosts;
/**
 同步查询缓存,若存在则返回结果,若不存在则返回nil,并触发异步查询
 
 */
- (NSArray*)getIpsByHost:(NSString*)host error:(NSError**)error;

/**
 触发同步解析,若存在缓存则立即返回,若不存在则触发同步解析,若到达timeout时间仍无结果,则返回nil,阻塞当前线程,请不要在主线程调用此接口
 
 */
- (NSArray *)getIpsByHostSync:(NSString *)host timeout:(NSUInteger)timeout error:(NSError **)error;
/**
 触发异步解析,请在回调中处理解析结果
 
 */
- (void)getIpsByHostAsync:(NSString *)host completion:(SMHttpDnsCompletion)completion;
/**
 根据域名获取IP列表,当缓存失效后,会等待HTTP DNS的返回结果,当HTTP DNS返回无效后,返回LOCAL DNS结果,不可在主线程使用
*/
- (NSArray *)getIpsForceHttp:(NSString *)host error:(NSError **)error;

- (void)setDefaultBackupIps:(NSDictionary *)backupIps;

/**
 查询缓存,若存在则返回结果,若不存在则返回localDNS解析的ip,并触发异步查询
 主要针对IPV6返回格式化后的IP
 */
//- (NSArray*)getIpsByHostInURLFormat:(NSString*)host;
/**
 设置HTTPDNS服务的Account ID
 */
- (void)setAccountID:(NSString*)accountID;
/**
 设置HTTPDNS服务的Label ID,用于批量数据下发标识
 */
- (void)setLabelID:(NSString*)labelID;
/**
 设置降级策略
 */
- (void)setDelegateForDegradationFilter:(id<HttpDNSDegradationDelegate>)delegate;
/**
 设置统计策略
 */
- (void)setDelegateForStatisticsFilter:(id<HttpDNSStatisticsDelegate>)delegate;
/**
 设置实验组
 */
- (void)setGroup:(NSString *)group;

@end
NS_ASSUME_NONNULL_END