SMHttpDnsService.h
4.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
//
// 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