You need to enable JavaScript to run this app.
导航

获取并运行 iOS 示例项目

最近更新时间2024.04.16 20:11:58

首次发布时间2023.03.22 20:49:16

您可以下载并运行示例项目,参考不同技术场景下的集成方案。

前提条件

  • 参考 快速入门 在火山引擎移动解析(HTTPDNS)控制台添加以下域名:
    • www.douyin.com

    警告

    示例项目会向上面的域名发送请求。如果您没有在控制台添加域名,HTTPDNS SDK 无法返回 HTTPDNS 服务端的解析结果,只能返回 Local DNS 的解析结果。
    如果您需要在示例项目中向其他域名发送请求,您也需要在控制台添加这些域名。

  • 准备开发环境:
    • 一台 macOS 或 Linux 主机。主机上安装了 Xcode
    • 与主机连接的 iOS 设备或 iOS 模拟器,用于运行示例项目。

操作步骤

  1. 下载并解压缩示例项目。

    BytedanceHTTPDNS_Demo-develop.zip
    46.48KB

  2. 在示例项目的 example 目录运行 pod 命令安装依赖。如果您收到 out-of-date source repos 的提示,需要运行 pod install --repo-update 命令。

    pod install
    
  3. 使用 Xcode 打开 example 目录下的 .xcworkspace 文件。

  4. 打开 TTAppDelegate.m 文件。在 info.httpDnsAccount 属性和 info.key 属性中分别填入您的 Service ID 和 Secret Key。Service ID 和 Secret Key 的获取方法参考 获取鉴权密钥

    警告

    示例代码了方便功能演示,直接在返回值传入 Service ID 和 Secret Key。在生产环境中,您需要避免直接传入明文。例如,您可以预先把明文进行编码或加密处理,在传值的时候再对已编码或加密的明文进行解码或解密。同时,您必须对 app 进行代码混淆处理。否则,您的 Service ID 和 Secret Key 可能会被第三方通过反编译的方式获得。

    [[TTDnsResolver shareInstance] setHttpDnsAuthenticationBlock: ^(void) {
          TTHttpDnsAuthenticationInfo* info = [[TTHttpDnsAuthenticationInfo alloc] init];
          info.httpDnsAccount = @"your_service_id";
          info.key = @"your_secret_key";
          return info;
    }];
    
  5. 连接 iOS 真机或模拟器。编译并运行项目。
    图片

结果验证

您可以在文本框填入您需要访问的网站 URL,例如 www.douyin.com。然后,您可以点击文本框下方的按钮,发送不同类型的请求。

(可选)DoH - PrivacyContext

通过 PrivateContext 更改移动解析 HTTPDNS 的 DNS 请求类型。
示例项目默认发送 HTTPDNS 请求。点击该按钮后,示例项目会发送 DoH 请求。

注意

您只能在 iOS 真机上验证该功能。

你必须确保已完成以下操作。否则按钮不生效。

  1. 在控制台开启 DoH 功能并获取 DoH 地址。参见 开启 DoH 并获取接入域名
  2. TTViewController.m 文件中设置 DoH 地址。
    - (void)privacyContextButtonClicked {
        if (@available(iOS 14.0, *)) {
            // 设置您在控制台获取的 DoH 地址
            nw_endpoint_t dohEndpoint = nw_endpoint_create_url("https://doh-xxxxxxxxxxxxxxx.volcdns.pub/dns-query");
            nw_resolver_config_t dohResolver = nw_resolver_config_create_https(dohEndpoint);
            nw_privacy_context_require_encrypted_name_resolution(NW_DEFAULT_PRIVACY_CONTEXT, true, dohResolver);
            
            NSURL* url = [NSURL URLWithString:self.urlInput.text];
            NSURLRequest* request = [NSURLRequest requestWithURL:url];
            [self sendRequestWithoutHook:request];
    

(可选)DoH - DNS Setting

通过 NEDNSSettingsManager 更改移动解析 HTTPDNS 的 DNS 请求类型。示例项目默认发送 HTTPDNS 请求。点击该按钮后,示例项目会发送 DoH 请求。

注意

您只能在 iOS 真机上验证该功能。

你必须确保已完成以下操作。否则按钮不生效。

  1. 在控制台开启 DoH 功能并获取 DoH 地址。参见 开启 DoH 并获取接入域名

  2. TTDNSSettingsManager.swift 文件中设置 DoH 地址。

    let doh = NEDNSOverHTTPSSettings()
    // 设置您在控制台获取的 DoH 地址
    doh.serverURL = URL(string: "https://doh-xxxxxxxxxxxxxxx.volcdns.pub/dns-query")
    
  3. 代码运行后,DNS 配置会被安装到 iOS 系统。为了让 DNS 配置生效,您需要在 iOS 设备的 设置 > 通用 > VPN 与设备管理 > DNS 中手动启用 DNS 配置。

您可以参考下面的视频了解如何手动启用 DNS 配置。


WKWebview

App 界面会通过 WKWebView 渲染您指定的网站。请求完成之后,您可以在界面上看到网页。同时,您在界面上看到打印的日志。

log: log type: mnet_log
first IP is xxx.xxx.xxx.xxx:443,
source is 6

其中,first IP 代表 App 发送请求时的目标 IP 地址。source 表示解析结果的来源,有以下取值:

  • 2:解析结果来自本地缓存
  • 6:解析结果来自 HTTPDNS 服务端
  • 8:解析结果来自 Local DNS 服务器

HTTPS POST request with SNI

App 会发送带 SNI(Server Name Indication) 信息的 HTTP POST 请求。您可以在界面上看到打印的日志。

HTTPS GET request with SNI

App 会发送带 SNI 信息的 HTTP GET 请求。请求完成之后,您可以在界面上看到打印的日志。

AFNetworking

App 会通过 AFNetworking 库发送请求。请求完成之后,您可以在界面上看到打印的日志。

Swift - Alamofire

App 会通过 Alamofire 库发送请求。请求完成之后,您可以在界面上看到打印的日志。

Swift - URLSession

App 会通过 NSURLSession 库发送请求。请求完成之后,您可以看到打印的日志。

查看解析请求统计数据

参考 查看解析请求统计数据 查看您发送的解析请求信息。

排障指南

如果您在运行示例项目时,无法获取 HTTPDNS 服务端的解析结果或遇到错误,您可以参考 常见问题

(可选)更改请求类型

您可以在 TTAppDelegate.m 文件调整 useMnetuseSharedSession 属性的值,切换请求使用的集成方案。useMnetuseSharedSession 属性的状态会显示在 app 界面上。关于不同集成方案的实现方法,您可以参见 选择集成方案

注意

如果您把 useMnet 设置为 NO,app 会使用自定义 NSURLProtocol 方案。该方案仅支持 HTTP 1.1。如果您的 app 向不支持 HTTP 1.1 的服务器发送请求,服务器会返回 505 错误码。

自 0.11.1 版本起,HTTPDNS iOS SDK 支持 MNet Protocol。MNet Protocol 继承了 NSURLProtocol,可以自动拦截 NSURLSession 中的请求。您可以通过引用 TTHttpMnetURLProtocol.h 头文件使用 MNet Protocol。MNet Protocol 解决了自定义 NSURLProtocol 使用的 CFNetwork 库功能受限,扩展性差的问题。

警告

0.16.7 版本删除了 TTHttpMnetURLProtocol 头文件。自 0.16.7 版本起,SDK 不再支持基于 MNet Protocol 的集成方案。

// useMnet = YES:配置 NSURLSession 使用 MNet Protocol,即 HTTPDNS SDK 提供的 TTHttpMnetURLProtocol
// useMnet = NO:配置 NSURLSession 使用自定义 NSURLProtocol,即示例项目中的 BDHttpMessageURLProtocol
[TTDnsSdkConfig sharedInstance].useMnet = YES;
// useSharedSession = YES:配置 NSURLSession 使用 sharedSession
// useSharedSession = NO:配置 NSURLSession 使用默认 NSURLSession
[TTDnsSdkConfig sharedInstance].useSharedSession = YES;

您可以参考 TTAppDelegate.m 了解 useMnetuseSharedSession 属性的值所对应的示例项目执行逻辑。

接下来您可以

在自己的 iOS 项目里集成 HTTPDNS SDK
HTTPDNS iOS SDK 的集成较为复杂。您也可以在 iOS 项目中通过 DoH 接入 HTTPDNS 服务端。DoH 功能不依赖 HTTPDNS iOS SDK。您可以直接通过 iOS 的原生方法接入 DoH。参见 在 iOS 客户端配置 DoH