VIPKID-OpenSource / KIDDNS-iOS

Using HTTPDNS over your network

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

KIDDNS

CI Status Version License Platform

KIDDNS是一个基于NSURLProtocol的HTTPDNS库,底层依托于阿里云的HTTPDNS服务,能够有效的避免DNS污染等问题,加速app中的网络请求。能够覆盖常见的HTTP及HTTPS场景,并且也兼容了HTTPS中的SNI场景。由于采用了NSURLProtocol,能够做到对业务方近乎无感的接入,只需简单配置,即可开始享受HTTPDNS的加速。

有关底层阿里云的HTTPDNS服务的使用及原理请参考阿里云官方文档

安装

KIDDNS is available through CocoaPods. To install it, simply add the following line to your Podfile:

pod 'KIDDNS'

Podfile中需要添加VIPKID的Spec源,以及阿里云的Spec源

source "https://github.com/VIPKID-OpenSource/Specs"
source "https://github.com/aliyun/aliyun-specs"

前提条件

需要拥有阿里云账号,并创建了开通HTTPDNS服务的应用。且阿里云控制台中配置好了app里需要开通HTTPDNS服务的域名。

使用方法

通过CocoaPodsKIDDNS库集成到工程后,只需简单配置,即可开始使用.

使用配置项初始化HTTPDNS服务,配置项包含阿里云应用的appId和appKey, 以及app需要预解析的域名列表。

NSArray<NSString *> *presolvedHostlist = @[@"api.abc.com", @"gateway.abc.com"];
KIDDNSConfig *config = [KIDDNSConfig new];
config.accountId = 100000;
config.key = @"your app key";
config.presolvedHosts = presolvedHostlist;
[[DNSCenter defaultCenter] initializeDNSServiceWithConfig:config];

建议将初始化服务放在didFinishLauch中,尽可能放在网络请求之前。

在app内部,你也可以针对某域名设置黑名单或者白名单,其规则是:

  • 如果域名在黑名单内,则该域名相关的请求不会走HTTPDNS服务;
  • 如果域名不在黑名单内,而在白名单内,则该域名相关的请求会尝试走HTTPDNS服务;
  • 如果域名既不在黑名单内,且不在白名单内,并且白名单不为空,则该域名相关请求不走HTTPDNS服务;
  • 如果域名既不在黑名单内,且不在白名单内,且白名单为空,则该域名相关请求会尝试走HTTPDNS服务;

黑白名单均是域名列表,支持正则匹配。

[DNSCenter defaultCenter].whiteList = @[@".vipkid.com.cn",@"api.abc.com"];

当app不需要KIDDNS服务运行时,也可以通过automaticDNS属性关闭KIDDNS服务。关闭之后KIDDNS中的NSURLProtocol就不再起作用。

[DNSCenter defaultCenter].automaticDNS = NO;

初始化KIDDNS服务之后,automaticDNS默认开启。

KIDDNS服务开启的情况下,每个经过KIDDNS服务的请求都会被记录其是否走了HTTPDNS服务,以及是否最终成功。接入方如果关心这类记录,可以实现一个遵循KIDDNSLogger协议的日志类,并将该类添加到KIDDNS的日志服务中。KIDDNS本身并不保存这些记录,请求结束后,记录即被销毁。

@interface KIDLogger : NSObject<KIDDNSLogger>

@end

@implementation KIDLogger

- (void)logLevel:(KIDDNSLogLevel)level result:(KIDDNSResult *)result
{
    NSLog(@"[DNSLog][%@] result: %@", @(level), result);
}

@end

...


[[DNSCenter defaultCenter] addLogger:[KIDLogger new]];

容错重试

KIDDNS在底层拿到了请求域名的IP后,才会对请求进行拦截并进行重写。如果使用IP的方式进行网络请求而导致请求失败,KIDDNS会尝试使用原域名的方式再发起一次网络请求,如果仍然失败,则请求最终以失败结束,如果请求成功,则对请求发起方来说,请求依然成功,对中间的失败过程无感。

注意事项

注意: 由于WKWebView页面及Cookie在HTTPDNS场景中很难处理,因此对于WebView请求KIDDNS并没有进行处理,仍然将使用系统默认的DNS服务

Author

yiyangest, y31210@gmail.com

License

KIDDNS is available under the MIT license. See the LICENSE file for more info.

About

Using HTTPDNS over your network

License:MIT License


Languages

Language:Objective-C 90.8%Language:Ruby 9.2%