基础配置接口

本文介绍HTTPDNS iOS SDK的基础配置接口。

初始化接口

通过此接口构建HTTPDNS全局服务实例。该实例采用单例设计模式,一旦初始化完成,该实例将持续存在于整个App生命周期中。开发者无需重复创建,首次创建后,在该App生命周期中,只需在使用时直接调用[HttpDnsService sharedInstance]接口获得该服务实例。

本接口提供两个版本,分别用于无需加密场景和需加密场景。若启用加密,则SDK内部向服务端发起请求时,请求参数和响应结果将会使用AES算法进行加密。使用加密能力可以获得更高的安全性,但在计费逻辑上也存在差异。关于计费逻辑可参考产品计费

确保在使用HTTPDNS解析接口前,已经调用本接口初始化完成,否则解析将失败。建议在 applicationDidFinishLaunching中完成初始化。

接口定义

- (nonnull instancetype)initWithAccountID:(NSInteger)accountID secretKey:(NSString * _Nonnull)secretKey;

- (nonnull instancetype)initWithAccountID:(NSInteger)accountID secretKey:(NSString * _Nonnull)secretKey aesSecretKey:(NSString * _Nullable)aesSecretKey;

所属类

HttpDnsService

参数说明

参数

类型

是否必填

说明

accountId

int

系统分配的Account ID,当您开通HTTPDNS后,您可以在控制台获取到您阿里云账号对应的Account ID信息。

secretKey

NSString

鉴权对应的secretKey,同样在阿里云HTTPDNS控制台获取。

aesSecretKey

NSString

加密功能对应的 aesSecretKey,同样在阿里云HTTPDNS控制台获取。若设置此参数,则SDK内部启用加密功能。

获取服务实例

在构造全局HTTPDNS服务实例之后,任何地方需要配置HTTPDNS或需要使用HTTPDNS解析域名时,都可以通过此接口获得全局单例。

接口定义

+ (instancetype)sharedInstance;

所属类

HttpDnsService

是否使用HTTPS请求

设置SDK内部向服务端发起解析请求时,是否使用HTTPS协议。若不调用该接口,默认使用HTTP协议。

使用HTTPS请求将会获得更高的安全性,但也要关注HTTPHTTPS两种方式在计费上的不同。关于计费逻辑可参考产品计费

说明
  • HTTP请求基于底层CFNetwork实现,不受ATS限制。

  • 使用HTTPS请求是否还需要加密:两者工作在不同层次。HTTPS协议保障传输层安全,但通过抓包方式仍可以查看参数和响应细节。AES加密保障HTTPDNS业务层安全,即使抓包也无法看到明文内容。因此,可以按需求决定是否都启用。

接口定义

- (void)setHTTPSRequestEnabled:(BOOL)enable;

所属类

HttpDnsService

参数说明

参数

类型

是否必填

说明

enable

BOOL

取值如下:

YES:使用HTTPS协议

NO:使用HTTP协议

是否允许使用过期IP

HTTPDNS iOS SDK遵循DNS协议,按照TTL缓存域名解析结果,从而提升App在发起网络请求时获取IP的效率。当缓存过期后,若App调用解析接口获取IP,此时会有不同情况:

  1. 如果App调用的是同步非阻塞接口,因为缓存已过期,但SDK又无法立即从服务端获得新的解析结果,为了不阻塞线程,该接口将返回空结果,需要调用方做降级到LocalDNS解析的处理。

  2. 如果App调用的是同步接口或异步接口,则SDK会发起解析请求从服务端获取新的解析,这个过程需要一定时间,则同步接口会阻塞线程直到获得新的解析结果,异步接口将在获得新的解析结果后才回调completionHandler

SDK提供设置选项,允许复用过期IP,设置为YES后,则上述两种情况,虽然缓存的IP过期了,但接口仍然可以立即返回这个过期的IP,从而减少DNS环节处理时间,提升网络请求性能。同时,SDK发现该IP过期,返回后,也会立即启动异步线程对这个域名进行解析,从而获取新的解析结果。

因此,开启这个选项的副作用非常小,特别是在,所解析域名本身的解析配置不会频繁变动时(如主站域名、静态网关域名等)。若域名确实发生解析变更,则开启该选项也只会影响该域名缓存过期后的第一个请求,因为SDK在被调用时发现IP过期,总是会立即发起对这个域名的解析更新。

默认不允许。

说明
  • 如果业务服务器IP变化比较频繁,建议谨慎启用该功能,以免对业务造成影响。

  • 2.x.x版本及以前,本接口定义为- (void)setExpiredIPEnabled:(BOOL)enable

接口定义

- (void)setReuseExpiredIPEnabled:(BOOL)enable;

所属类

HttpDnsService

参数说明

参数

类型

是否必填

说明

enable

BOOL

是否允许解析接口返回TTL过期的缓存解析结果。

YES:允许

NO:不允许

是否启用持久化缓存

持久化缓存功能旨在优化启动后的域名解析环节耗时,进而提升首屏加载速度。

开启后,HTTPDNS会将上一次解析到的结果保存到本地持久层,App重启后,每个域名首次解析会优先从持久层获取缓存结果,以实现最快的解析效率。也正因如此,存在第一次使用的IP为过期IP的可能性,即该缓存结果TTL已过期。但大多数情况下该IP依然可以正常使用,特别是对于解析记录比较稳定的域名。

为了避免App启动后,复用了已经过期太久的缓存(例如App上一次启动是一个月前),本接口从3.1.2版本起,提供discardRecordsHasExpiredFor:(NSTimeInterval)duration参数。该参数决定App启动后,从持久层加载缓存到内存中时,丢弃已经过期超过duration时长的解析结果。建议设置为1天。

默认不开启。

说明
  • 如果业务服务器IP变化比较频繁,建议谨慎开启该功能,以免对业务造成影响。

  • 持久化缓存仅影响第一次域名解析结果,后续解析仍会请求HTTPDNS服务器,并更新本地缓存。

  • 开启此功能后,每次网络解析记录,会更新到本地缓存;App重启后,首先加载本地缓存到内存中。

  • 2.x.x版本及以前,本接口定义为- (void)setCachedIPEnabled:(BOOL)enable;

接口定义

- (void)setPersistentCacheIPEnabled:(BOOL)enable;

- (void)setPersistentCacheIPEnabled:(BOOL)enable discardRecordsHasExpiredFor:(NSTimeInterval)duration; // (从3.1.2版本起提供)

所属类

HttpDnsService

参数说明

参数

类型

是否必填

说明

enable

BOOL

取值如下:

YES:开启

NO:关闭

duration

NSTimeInterval

本参数仅在开启了持久化缓存的情况下有效。此时,启动后,SDK从本地持久化缓存中加载记录到内存缓存中时,将过期时间已经超过此duration的记录清除。

单位为秒值,默认是0秒。即,默认丢弃已经过期的记录。

是否开启网络变化自动解析

当设备网络变化时(如从WIFI网络切换到蜂窝网络,或从移动网络切换到联通网络),若HTTPDNS SDK继续返回之前缓存的解析IP,则可能导致业务网络请求发生跨网情况,影响请求性能和成功率。因此,SDK内部会监听网络变化事件,智能决定是否清理全局解析缓存。

此接口用于设置网络环境变化,SDK清理全局解析缓存后,是否自动刷新所有域名的解析结果,若开启,则保证切换网络后,业务网络请求也能立即拿到新的结果,降低域名解析环节耗时,进而提升请求性能。

开启此功能可能会轻微增加解析次数消耗。默认不开启。

接口定义

- (void)setPreResolveAfterNetworkChanged:(BOOL)enable;

所属类

HttpDnsService

参数说明

参数

类型

是否必填

说明

enable

BOOL

取值如下:

YES:开启

NO:关闭