すべてのプロダクト
Search
ドキュメントセンター

HTTPDNS:iOS の WebView シナリオにおける HTTPDNS の使用

最終更新日:Dec 18, 2025

重要

このドキュメントでは、WKWebView シナリオで HTTPDNS によって解決された IP アドレスを使用する方法について説明します。HTTPDNS 名前解決サービスの詳細については、『』または『iOS SDK 統合マニュアル』をご参照ください。

1. はじめに

iOS プラットフォームのネイティブシナリオで HTTPDNS を使用してハイジャック対策、正確なスケジューリング、およびインスタント DNS 名前解決を実装する方法については、「iOS のネイティブシナリオで HTTPDNS を使用する」で学習しました。

WKWebView は、iOS 上でネットワークリクエストが頻繁に関わるもう一つのシナリオです。WKWebView は、iOS アプリケーションで Web コンテンツを表示するために WebKit フレームワークが提供する最新の Web ビューです。従来の UIWebView に代わるもので、より優れたパフォーマンス、より多くの機能、そしてより高いセキュリティを提供します。WKWebView が Web ページを読み込む際に HTTPDNS を使用することで、ネットワークのセキュリティとパフォーマンスを向上させることができます。

2. 現在の技術

iOS システムの進化に伴い、HTTPDNS と WKWebView を統合するための技術的ソリューションも進化しています:

  • iOS 17.0 以前:Apple は WKWebView での DNS 名前解決のための公式なフックインターフェイスを提供していませんでした。また、カスタムのネットワークリクエスト実装のためのインターフェイスも直接提供していませんでした。このため、非公開 API をフックしてトラフィックをインターセプトする複雑なソリューションが必要でした。

  • iOS 17.0 以降: Apple は ProxyConfiguration API を導入しました。この API は、WKWebView の公式プロキシ構成機能を提供します。これにより、すべてのネットワークリクエストを確実にインターセプトできるため、HTTPDNS をシームレスに統合できます。

Apple の公式統計 (2025 年 6 月 4 日時点) によると、iOS 17 以降はすべての iPhone デバイスの 85% 以上にインストールされており、この数は増加し続けています。HTTPDNS は、ハイジャック対策、正確なスケジューリング、即時解決など、WKWebView シナリオに対して非機能的な改善を提供します。したがって、このソリューションを使用して HTTPDNS を統合することを推奨します。このアプローチは、ほとんどの顧客をカバーします。古いシステムバージョンのユーザーは、アップグレードするにつれて徐々にこの機能を利用できるようになります。

3. 推奨ソリューション: iOS 17 以降向けのローカルプロキシベースのソリューション

3.1 ソリューションの概要

iOS 17.0 で導入された ProxyConfiguration API により、アプリケーションは WKWebView 用のローカルプロキシサーバーを構成できます。このメソッドは、ローカルプロキシサーバーを起動し、WKWebView からのすべてのネットワークリクエストをインターセプトします。プロキシレイヤーで、サーバーは HTTPDNS ドメイン名の名前解決を実行し、その後リクエストを実際のサーバーに転送します。

image

従来の技術ソリューションと比較して、ローカルプロキシソリューションには次の大きな利点があります。

  1. 安定性:このソリューションは iOS 17 以降の公式 API に基づいています。非公開 API や難読化技術に依存しないため、最高の安定性と互換性を提供します。

  2. 適用性:このソリューションは WebView に対して完全に透明です。Cookie、リダイレクト、Cross-Origin Resource Sharing (CORS) などの複雑な詳細を処理する必要はありません。HTTP、HTTPS、WebSocket などのすべてのプロトコルをサポートし、幅広いカバー率を提供します。

  3. セキュリティ:ローカルプロキシはアプリサンドボックス内に隔離されています。外部に公開されることはなく、悪用可能な攻撃対象領域もありません。

  4. ハイパフォーマンス:これは純粋なローカル実装です。すべてのネットワークデータはメモリレベルで一度だけコピーされます。クライアントのパフォーマンスオーバーヘッドは無視できるレベルです。

  5. 容易なメンテナンス: 実装ロジックが明確で、メンテナンスコストが比較的低くなります。

3.2 統合リファレンス

ローカルプロキシサービスの作成、HTTP リクエストの解析、HTTPDNS 名前解決結果に基づく接続の作成、およびデータ転送には、かなりの実装作業が必要です。私たちは GitHub で実装をオープンソース化し、SDK としてリリースしました:オープンソースリポジトリ。この実装は、ビジネス要件に合わせて調整することができます。

3.2.1 Cocoapods 統合

Podfile に EMASLocalProxy の依存関係を追加します:

source 'https://github.com/aliyun/aliyun-specs.git'

target 'yourAppTarget' do
    use_framework!
    
    pod 'AlicloudHTTPDNS', 'x.x.x'
    pod 'EMASLocalProxy', 'x.x.x'
end

3.2.2 使用例

統合後、初期化時に WKWebView を次のように構成できます:

#import <EMASLocalProxy/EMASLocalProxy.h>
#import <AlicloudHttpDNS/AlicloudHttpDNS.h>

// Create a WKWebViewConfiguration
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];

// Configure the DNS resolver
[EMASLocalHttpProxy setDNSResolverBlock:^NSArray<NSString *> *(NSString *hostname) {
    // Get the HTTPDNS service instance
    HttpDnsService *httpdns = [HttpDnsService sharedInstance];
    HttpdnsResult *result = [httpdns resolveHostSyncNonBlocking:hostname byIpType:HttpdnsQueryIPTypeBoth];

    if (result && (result.hasIpv4Address || result.hasIpv6Address)) {
        NSMutableArray<NSString *> *allIPs = [NSMutableArray array];
        if (result.hasIpv4Address) {
            [allIPs addObjectsFromArray:result.ips];
        }
        if (result.hasIpv6Address) {
            [allIPs addObjectsFromArray:result.ipv6s];
        }
        NSLog(@"HTTPDNS resolution successful. Domain name: %@, IP: %@", hostname, allIPs);
        return allIPs;
    }

    NSLog(@"HTTPDNS resolution failed. Domain name: %@", hostname);
    return nil;
}];

// Set the log level
[EMASLocalHttpProxy setLogLevel:EMASLocalHttpProxyLogLevelDebug];

// Configure the WebView proxy
BOOL proxyConfigured = [EMASLocalHttpProxy installIntoWkWebViewConfiguration:config];
if (proxyConfigured) {
    NSLog(@"WebView proxy configuration successful.");
} else {
    NSLog(@"WebView proxy configuration failed. Using the system network.");
}

WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:config];
重要

本番環境にデプロイする前に、コードの実装ロジックを読み、理解してください。完全な互換性を確保するために、徹底的なテストを実施してください。

3.3 実装の詳細

EMASLocalProxy の完全な実装は、iOS 17.0 以降の ProxyConfigurations API と Network.framework に基づいています。高パフォーマンスのローカルプロキシサービスを提供します。技術実装の詳細については、オープンソースコードを参照してください。

GitHub ソースコードhttps://github.com/aliyun/alicloud-ios-sdk-emascurl/tree/master/EMASLocalProxy

主要な技術的ポイントは以下のとおりです:

  • Network フレームワークを使用してローカル HTTP プロキシサーバーを作成します。

  • CONNECT トンネルを介して HTTP リクエストを処理します。

  • クライアントとターゲットサーバー間で透過的なデータ転送を実装します。

  • カスタム DNS リゾルバーを統合して HTTPDNS をサポートします。

  • 完全なフォールバックおよびエラー処理メカニズムを提供します。

3.4 フォールバックと最適化ソリューション

EMASLocalHttpProxy は、複数の異常シナリオを処理するように設計されています。多層の保護と自動フォールバックメカニズムが組み込まれています。その目的は、システムの高可用性 (HA) と最終的なネットワークリクエストの到達可能性を確保しつつ、ハイパフォーマンスなローカルプロキシ機能を提供することです。コンポーネントの障害や外部依存関係の異常が発生した場合でも、ユーザーエクスペリエンスへの影響は最小限に抑えられます。

次の表に、さまざまな異常シナリオと対応する対策を示します。

シナリオ

トリガー

フォールバックまたは保護対策

最終的な効果

プロキシ起動

ポートの競合

ランダムポートで自動的に再試行する

起動の成功率を高める

起動がブロックされた

起動タイムアウト時に終了する

アプリケーションのフリーズを防ぐ

プロキシランタイム

nw_listener クラッシュ

サービスを「実行していない」とマークする

後続のフォールバックポリシーをトリガーする

外部アクセス試行

127.0.0.1 のみでリッスンする

LAN (ローカルエリアネットワーク) アクセスを拒否してセキュリティを確保する

WebView 構成

サービスが実行されていない

永続的でない WKWebsiteDataStore を使用する

デフォルトのシステムネットワークにフォールバックする

システムバージョンが iOS 17 より前である

プロキシ構成をスキップする

デフォルトのシステム動作との一貫性を維持する

DNS 名前解決

カスタムリゾルバーが例外をスローする

例外をキャッチし、元のドメイン名を使用してローカル DNS 名前解決を行う

名前解決エラーによる接続障害を防ぐ

ネットワーク接続

ターゲットサーバーへの接続に失敗した

502 Bad Gateway 応答を返す

標準化された障害フィードバックを提供する

この多層設計により、HttpdnsLocalHttpProxy は複雑で変化の激しいネットワーク環境で確実に動作できます。その完全なフォールバックメカニズムにより、一部のコンポーネントに障害が発生した場合でも、リクエストパスが中断されることはありません。

4. グローバル NSURLProtocol インターセプトソリューション

このソリューションは、HTTPDNS を iOS WebView と統合するための最も初期の実行可能な選択肢でした。導入のハードルが非常に高く、効果もあまり高くありません。しかし、初期の iOS には他の選択肢がなかったため、存続してきました。その原理は NSURLProtocol に基づいており、iOS 上の NSURLConnection/NSURLSession などの上位ネットワークライブラリから送信されるネットワークリクエストをインターセプトできます。WKWebView からのリクエストも含まれます。リクエストをインターセプトした後、このソリューションは HTTPDNS を使用してドメイン名の名前解決と後続の処理を行います。手順は次のとおりです:

  1. 次のインターフェイスを介してカスタム NSURLProtocol を登録し、WKWebView からの上位ネットワークリクエストをインターセプトできます。その後、新しいネットワークリクエストを作成して、データ送受信、リダイレクト、その他の処理ロジックを引き継ぎます。結果は元のリクエストにフィードバックされます。

    [NSURLProtocol registerClass:[HttpDnsNSURLProtocolImpl class]];
  2. 以下は、カスタム NSURLProtocol の処理手順の概要です:

    • canInitWithRequest で、HTTPDNS ドメイン名解決が必要なリクエストをフィルタリングします。

    • リクエストがインターセプトされた後、HTTPDNS ドメイン名解決を実行します。

    • 名前解決が完了した後、通常のリクエストと同様に、URL.host フィールドと HTTP ヘッダーの Host フィールドを置き換えます。その後、このリクエストのデータ送受信、リダイレクト、その他の処理を引き継ぎます。

    • NSURLProtocol インターフェイスを使用して、リクエスト処理結果を元の WebView リクエストにフィードバックします。

  3. カスタム NSURLProtocol の実装ロジックの詳細については、提供されているデモの HttpDnsNSURLProtocolImpl.m をご参照ください。

警告

Apple は多くのプロトコルの詳細を公式に開示していないため、このソリューションを本番環境で実現可能にするには、Cookie やリダイレクトなどの詳細を必要に応じて処理する必要があります。特別な要件がない限り、このソリューションは使用しないでください。

5. ソリューションのまとめと比較

このドキュメントでは、iOS の WKWebView シナリオで HTTPDNS を統合するための 2 つの主要な技術ソリューションを紹介しました:iOS 17 以降に基づくローカルプロキシソリューションと、グローバル NSURLProtocol インターセプトソリューションです。

各ソリューションには、特定のシナリオ、利点、欠点、および実装の複雑さがあります。迅速な意思決定を支援するために、次の表ではこれら 2 つのソリューションを横並びで比較しています:

ディメンション / ソリューション

ローカルプロキシ (ProxyConfiguration) (iOS 17+)

グローバル NSURLProtocol インターセプト

公式サポート

Apple が iOS 17 で導入した正式なパブリック API であり、長期間使用できます。

公開されている NSURLProtocol API を使用しますが、WKWebView の内部詳細に関する公式ドキュメントがありません。

有効バージョン

iOS 17 以降。iOS 17 より前のバージョンでは、プロキシは非アクティブであり、副作用はありません。

iOS 11 以降

プロトコルカバレッジ

HTTP、HTTPS、WebSocket、および HTTP/2 (元のトラフィックを透過的に転送します)。

NSURLSession と NSURLConnection で処理できるプロトコルに制限されます。

実装の複雑さ

中: ローカルプロキシ、ポート管理、および双方向転送の実装が必要です。

中:リクエストの書き換え、スレッド間の相互作用、キャッシュの相互作用を処理する必要があります。

ビジネスコードへの侵入性

低: WKWebView にはプロキシ構成のみが必要です。

中:グローバルに NSURLProtocol を登録するため、既存の NSURLSession ロジックに影響を与える可能性があります。

Cookie / キャッシュ / CORS

プロキシレイヤーで透過的です。追加の処理は必要ありません。

開発者はこれを自分で維持する必要があり、エッジケースを見落とすのは簡単です。

メンテナンスコスト

低: 公式 API に依存しており、バージョンアップグレードの問題のリスクが低くなります。

中:システム API は安定していますが、WKWebView の内部動作の変更に注意が必要です。

障害フォールバックポリシー

サポートされています。プロキシに障害が発生した場合、システムネットワークにフォールバックできます。

自己実装が必要です。

推奨シナリオ

主な推奨ソリューション:セキュリティと互換性に対する要件が高い iOS 17 以降をターゲットとするユーザー向け。

軽量な変更と迅速な検証、複雑なリクエストの互換性に関する要件が低い場合向け。

安定性、開発・メンテナンスコスト、および将来のトレンドを考慮すると、iOS 17 以降に基づくローカルプロキシソリューションを強く推奨します

iOS 17 以降のシステムバージョンが急速に普及するにつれて、このソリューションは最小限のコストで大多数のユーザーに安定した信頼性の高い HTTPDNS サービスを提供します。これにより、ドメインハイジャックを効果的に解決し、ネットワークパフォーマンスを向上させます。その洗練された実装と公式サポートにより、ソリューションの長期的な実現可能性が保証されます。iOS 17 より前のシステムバージョンでは、スムーズなフォールバック戦略が使用されます。これは、システムのデフォルトのネットワークリクエストが使用されることを意味します。ユーザーがシステムをアップグレードすると、自動的に HTTPDNS の恩恵を受けることができます。

もう一方のソリューションには、固有の複雑さと不確実性があります。慎重に採用してください。特別な要件と深い技術的専門知識を持つチームが、慎重な評価と徹底的なテストを行った後にのみ推奨されます。