集成httpdns

This commit is contained in:
kai60
2022-01-17 11:40:56 +08:00
parent 7b7faab5ce
commit f63f7d216c
82 changed files with 2789 additions and 13 deletions
@@ -0,0 +1,27 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#import <Foundation/Foundation.h>
static NSString *const HTTPDNS_IOS_SDK_VERSION = @"2.0.5";
#import <Foundation/Foundation.h>
#import "HttpdnsLoggerDelegate.h"
#import "HttpdnsServiceProvider.h"
#import "HttpdnsDegradationDelegate.h"
@@ -0,0 +1,29 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#ifndef HttpdnsDegradationDelegate_h
#define HttpdnsDegradationDelegate_h
@protocol HttpDNSDegradationDelegate <NSObject>
- (BOOL)shouldDegradeHTTPDNS:(NSString *)hostName;
@end
#endif /* HttpdnsDegradationDelegate_h */
@@ -0,0 +1,20 @@
//
// HttpdnsLoggerProtocol.h
// AlicloudHttpDNS
//
// Created by junmo on 2018/12/19.
// Copyright © 2018年 alibaba-inc.com. All rights reserved.
//
#ifndef HttpdnsLoggerProtocol_h
#define HttpdnsLoggerProtocol_h
#import <Foundation/Foundation.h>
@protocol HttpdnsLoggerProtocol <NSObject>
- (void)log:(NSString *)logStr;
@end
#endif /* HttpdnsLoggerProtocol_h */
@@ -0,0 +1,184 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#import <Foundation/Foundation.h>
#import "HttpdnsDegradationDelegate.h"
#import "HttpdnsLoggerDelegate.h"
#define ALICLOUD_HTTPDNS_DEPRECATED(explain) __attribute__((deprecated(explain)))
extern NSString *const ALICLOUDHDNS_IPV4;
extern NSString *const ALICLOUDHDNS_IPV6;
typedef NS_ENUM(NSUInteger, AlicloudHttpDNS_IPType) {
AlicloudHttpDNS_IPTypeV4, //ipv4
AlicloudHttpDNS_IPTypeV6, //ipv6
AlicloudHttpDNS_IPTypeV64, //ipv4 + ipv6
};
@interface HttpDnsService: NSObject
@property (nonatomic, assign, readonly) int accountID;
@property (nonatomic, copy, readonly) NSString *secretKey;
@property (nonatomic, weak, setter=setDelegateForDegradationFilter:) id<HttpDNSDegradationDelegate> delegate;
@property (nonatomic, assign) NSTimeInterval timeoutInterval;
- (instancetype)autoInit;
- (instancetype)initWithAccountID:(int)accountID;
/*!
* @brief 启用鉴权功能的初始化接口
* @details 初始化、开启鉴权功能,并设置 HTTPDNS 服务 Account ID,鉴权功能对应的 secretKey。
* 您可以从控制台获取您的 Account ID 、secretKey 信息。
* 此方法会初始化为单例。
* @param accountID 您的 HTTPDNS Account ID
* @param secretKey 鉴权对应的 secretKey
*/
- (instancetype)initWithAccountID:(int)accountID secretKey:(NSString *)secretKey;
/*!
* @brief 校正 App 签名时间
* @param authCurrentTime 用于校正的时间戳,正整数。
* @details 不进行该操作,将以设备时间为准,为`(NSUInteger)[[NSDate date] timeIntervalSince1970]`。进行该操作后,如果有偏差,每次网络请求都会对设备时间进行矫正。
* @attention 校正操作在 APP 的一个生命周期内生效,APP 重启后需要重新设置才能重新生效。可以重复设置。
*/
- (void)setAuthCurrentTime:(NSUInteger)authCurrentTime;
+ (instancetype)sharedInstance;
/// 设置持久化缓存功能
/// @param enable YES: 开启 NO: 关闭
- (void)setCachedIPEnabled:(BOOL)enable;
/// 是否允许 HTTPDNS 返回 TTL 过期域名的 ip ,建议允许(默认不允许)
/// @param enable YES: 开启 NO: 关闭
- (void)setExpiredIPEnabled:(BOOL)enable;
/// * 设置 HTTPDNS 域名解析请求类型 ( HTTP / HTTPS )
/// 若不调用该接口,默认为 HTTP 请求。
/// HTTP 请求基于底层 CFNetwork 实现,不受 ATS 限制;
/// @param enable YES: HTTPS请求 NO: HTTP请求
- (void)setHTTPSRequestEnabled:(BOOL)enable;
/// 设置 region 节点,调用后,会按照 region 更新服务IP
/// @param region region为节点,可设置海外region
- (void)setRegion:(NSString *)region;
/// 域名预解析 (ipv4)
/// 选择性的预先向 HTTPDNS SDK 中注册您后续可能会使用到的域名,以便 SDK 提前解析,减少后续解析域名时请求的时延
/// @param hosts 预解析列表数组
- (void)setPreResolveHosts:(NSArray *)hosts;
/// 域名预解析
/// @param hosts 域名
/// @param ipType 4: ipv4; 6: ipv6; 64: ipv4+ipv6
- (void)setPreResolveHosts:(NSArray *)hosts queryIPType:(AlicloudHttpDNS_IPType)ipType;
/// 本地日志 log 开关
/// @param enable YES: 打开 NO: 关闭
- (void)setLogEnabled:(BOOL)enable;
/// 设置网络切换时是否自动跟新所有域名解析结果
/// 如果打开此开关,在网络切换时,会自动刷新所有域名的解析结果,但会产生一定流量消耗
/// @param enable YES: 开启 NO: 关闭
- (void)setPreResolveAfterNetworkChanged:(BOOL)enable;
/// 设置IP俳优规则
/// @param IPRankingDatasource 设置对应域名的端口号
/// @{host: port}
- (void)setIPRankingDatasource:(NSDictionary<NSString *, NSNumber *> *)IPRankingDatasource;
/// 设置是否 开启 IPv6 结果解析
/// 开启后调用 getIPv6ByHostAsync: 接口使用
///【注意】开启 IPv6 结果解析后,SDK在 IPv6-Only 网络环境下,对 IPv4 解析结果不再自动转换为 IPv6 地址, getIpsByHostAsync:返回 IPv4 地址,getIPv6ByHostAsync:返回 IPv6 地址
/// @param enable YES: 开启 NO: 关闭
- (void)enableIPv6:(BOOL)enable;
/// 是否允许通过 CNCopyCurrentNetworkInfo 获取wifi ssid bssid
/// @param enable YES: 开启 NO: 关闭 ,默认关闭
- (void)enableNetworkInfo:(BOOL)enable;
/// 获取用于用户追踪的 sessionId
/// sessionId为随机生成,长度为 12 位,App 生命周期内保持不变
/// 为了排查可能的解析问题,需要您将 sessionId 和解析出的 IP 一起记录在日志中
/// 请参考: 解析异常排查之 “会话追踪方案” https://help.aliyun.com/document_detail/100530.html
- (NSString *)getSessionId;
/// 获取域名对应的IP,单IP
/// @param host 域名
- (NSString *)getIpByHostAsync:(NSString *)host;
/// 获取域名对应的IP数组,多IP
/// @param host 域名
- (NSArray *)getIpsByHostAsync:(NSString *)host;
/// 获取域名对应格式化后的IP (针对ipv6)
/// @param host 域名
- (NSString *)getIpByHostAsyncInURLFormat:(NSString *)host;
/// 获取域名对应的ipv6, 单IP (需要开启ipv6 开关 enableIPv6
/// @param host 域名
- (NSString *)getIPv6ByHostAsync:(NSString *)host;
/// 获取域名对应的ipv6数组, 多IP (需要开启ipv6 开关 enableIPv6
/// @param host 域名
- (NSArray *)getIPv6sByHostAsync:(NSString *)host;
/// 同时获取ipv4 ipv6的IP (需要开启ipv6 开关 enableIPv6
/// @param host 域名
/// @result 返回字典类型结构
/// {
/// ALICLOUDHDNS_IPV4: ['xxx.xxx.xxx.xxx', 'xxx.xxx.xxx.xxx'],
/// ALICLOUDHDNS_IPV6: ['xx:xx:xx:xx:xx:xx:xx:xx', 'xx:xx:xx:xx:xx:xx:xx:xx']
/// }
- (NSDictionary <NSString *, NSArray *>*)getIPv4_v6ByHostAsync:(NSString *)host;
/// 清除指定host缓存(内存+沙盒数据库)
/// @param hostArray 需要清除的host域名数组。如果需要清空全部数据传nil或者空数组即可
- (void)cleanHostCache:(NSArray <NSString *>*)hostArray;
/// 设置日志输出回调
- (void)setLogHandler:(id<HttpdnsLoggerProtocol>)logHandler;
- (void)setSdnsGlobalParams:(NSDictionary<NSString *, NSString *> *)params;
- (void)clearSdnsGlobalParams;
- (NSDictionary *)getIpsByHostAsync:(NSString *)host withParams:(NSDictionary<NSString *, NSString *> *)params withCacheKey:(NSString *)cacheKey;
@end
@interface HttpDnsService (HttpdnsDeprecated)
- (void)setAccountID:(int)accountID ALICLOUD_HTTPDNS_DEPRECATED("Deprecated in v1.5.2. Use -[HttpDnsService initWithAccountID:] instead.");
@end