このドキュメントでは、WKWebView シナリオで HTTPDNS で名前解決した IP アドレスを使用する方法について説明します。HTTPDNS の名前解決サービスの詳細については、「」または「iOS SDK Integration Manual」をご参照ください。
1. はじめに
iOS のネイティブシナリオで HTTPDNS を使用するでは、iOS プラットフォームのネイティブシナリオで HTTPDNS を使用し、ハイジャック対策、正確なスケジューリング、即時の DNS 名前解決を実現する方法を説明しました。
WKWebView は、iOS においてネットワークリクエストが頻繁に発生するもう 1 つのシナリオです。WKWebView は WebKit フレームワークが提供する最新の Web ビューであり、iOS アプリケーションで 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 の公式統計 (2024 年 6 月 4 日時点) によると、iOS 17 以降は全 iPhone デバイスの 85% 以上にインストールされており、この数値は増加しています。HTTPDNS は、WKWebView シナリオにおいて、ハイジャック対策、正確なスケジューリング、即時の名前解決といった非機能面の改善を提供します。そのため、このソリューションを使用して HTTPDNS を統合することを推奨します。このアプローチで大多数のお客様に対応できます。古いシステムバージョンのユーザーも、アップグレードに伴い徐々にこの機能を利用できるようになります。
3. 推奨ソリューション:iOS 17+ 向けローカルプロキシベースのソリューション
3.1 ソリューションの概要
iOS 17.0 では ProxyConfiguration API が導入され、アプリケーションが WKWebView 向けにローカルプロキシサーバーを構成できるようになりました。この方法では、WKWebView からのすべてのネットワークリクエストをインターセプトするローカルプロキシサーバーを起動します。プロキシ層で HTTPDNS でドメイン名を解決し、その後リクエストを実サーバーに転送します。

従来の技術ソリューションと比較して、ローカルプロキシソリューションには次のような大きな利点があります:
安定性:このソリューションは iOS 17 以降の公式 API に基づいています。プライベート API や難読化の手法に依存しないため、最高レベルの安定性と互換性を提供します。
適用性:このソリューションは WebView にとって完全に透過的です。Cookie、リダイレクト、オリジン間リソース共有 (CORS) などの複雑な詳細を処理する必要はありません。HTTP、HTTPS、WebSocket など、すべてのプロトコルをサポートし、幅広く対応しています。
セキュリティ:ローカルプロキシは App Sandbox 内で分離されており、外部に公開されず、悪用可能な攻撃対象領域もありません。
高パフォーマンス:これは純粋にローカルな実装です。ネットワークデータはメモリ上で 1 回だけコピーされます。クライアント側のパフォーマンスオーバーヘッドは無視できるレベルです。
保守性:実装ロジックが明確で、保守コストは比較的低く抑えられます。
3.2 実装リファレンス
ローカルプロキシサービスの作成、HTTP リクエストの解析、HTTPDNS の名前解決結果に基づく接続の作成、データ転送には大きな実装工数が必要です。GitHub 上で実装をオープンソース化し、SDK として公開しています:Open-source repository。必要に応じてこの実装を調整し、ビジネス要件に合わせることができます。
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'
end3.2.2 使用例
統合後、初期化時に次のように WKWebView を構成できます:
#import <EMASLocalProxy/EMASLocalProxy.h>
#import <AlicloudHttpDNS/AlicloudHttpDNS.h>
// WKWebViewConfiguration を作成します
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
// DNS リゾルバーを構成します
[EMASLocalHttpProxy setDNSResolverBlock:^NSArray<NSString *> *(NSString *hostname) {
// HTTPDNS サービスインスタンスを取得します
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;
}];
// ログレベルを設定します
[EMASLocalHttpProxy setLogLevel:EMASLocalHttpProxyLogLevelDebug];
// WebView プロキシを構成します
BOOL proxyConfigured = [EMASLocalHttpProxy installIntoWebViewConfiguration:config];
if (proxyConfigured) {
NSLog(@"WebView proxy configuration successful.");
} else {
NSLog(@"WebView proxy configuration failed. Using system network.");
}
WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:config];本番環境にデプロイする前に、コードの実装ロジックを読み、理解してください。十分なテストを実施し、完全な互換性を確保してください。
3.3 実装の詳細
EMASLocalProxy の完全な実装は、iOS 17.0 以降向けの ProxyConfigurations API と Network.framework に基づいています。高性能なローカルプロキシサービスを提供します。技術実装の詳細については、オープンソースコードをご参照ください:
GitHub source code:https://github.com/aliyun/alicloud-ios-sdk-emascurl/tree/master/EMASLocalProxy
コアとなる技術ポイントは次のとおりです:
Network.framework を使用したローカル HTTP プロキシサーバーの作成
CONNECT トンネルによる HTTP リクエストの処理
クライアントとターゲットサーバー間における透過的なデータ転送
HTTPDNS をサポートするためのカスタム DNS リゾルバーの統合
完全なフォールバックおよびエラーハンドリング機構の提供
3.4 フォールバックと最適化
EMASLocalHttpProxy は複数の異常シナリオに対応できるよう設計されています。多層の保護と自動フォールバックの仕組みを内蔵しています。目的は、高性能なローカルプロキシ機能を提供しつつ、システムの高可用性 (HA) を確保し、最終的なネットワークリクエストの到達性を保証することです。コンポーネントの障害や外部依存関係の異常が発生した場合でも、ユーザー体験への影響を最小限に抑えます。
次の表では、異常シナリオとそれに対応する対策を示します:
シナリオ | トリガー | フォールバックまたは保護対策 | 最終的な効果 |
プロキシ起動 | ポートの競合 | ランダムなポートで自動的に再試行 | 起動成功率が向上 |
起動がブロックされる | 起動タイムアウトで終了 | アプリケーションのフリーズを防止 | |
プロキシ実行時 |
| サービスを "not running" としてマーク | 後続のフォールバックポリシーをトリガー |
外部からのアクセス試行 | 127.0.0.1 のみでリッスン | ローカルエリアネットワーク (LAN) からのアクセスを拒否してセキュリティを確保 | |
WebView 構成 | サービスが実行されていない | 非永続的な | デフォルトのシステムネットワークにフォールバック |
システムバージョンが iOS 17 より前 | プロキシ構成をスキップ | デフォルトのシステム動作との一貫性を維持 | |
DNS 名前解決 | カスタムリゾルバーが例外をスロー | 例外をキャッチし、元のドメイン名を使用してローカル DNS 名前解決を実行 | 名前解決エラーによる接続失敗を防止 |
ネットワーク接続 | ターゲットサーバーへの接続に失敗 |
| 標準化された失敗フィードバックを提供 |
この多層設計により、HttpdnsLocalHttpProxy は複雑で変化の激しいネットワーク環境でも安定して動作します。その完全なフォールバックメカニズムにより、一部のコンポーネントに障害が発生した場合でも、リクエストパスが中断されることはありません。
4. グローバル NSURLProtocol インターセプトソリューション
このソリューションは、HTTPDNS を iOS WebView と統合するための、最も初期の実現可能な選択肢でした。導入の障壁が非常に高く、あまり効果的ではありません。しかし、初期の iOS には他の選択肢がなかったため、このソリューションは存続してきました。その原理は NSURLProtocol に基づいており、これにより iOS の NSURLConnection/NSURLSession のような上位レイヤーのネットワークライブラリから送信されるネットワークリクエストをインターセプトできます。WKWebView からのリクエストも含まれます。リクエストをインターセプトした後、このソリューションは HTTPDNS を使用してドメイン名の解決とその後の処理を行います。手順は次のとおりです。
次のインターフェイスを介してカスタム
NSURLProtocolを登録することで、WKWebView からの上位レイヤーのネットワークリクエストをインターセプトできます。その後、新しいネットワークリクエストを作成して、データの送受信、リダイレクト、およびその他の処理ロジックを引き継ぐことができます。結果は元のリクエストに返されます。[NSURLProtocol registerClass:[HttpDnsNSURLProtocolImpl class]];カスタム
NSURLProtocolの処理手順の概要は次のとおりです。canInitWithRequestで、HTTPDNS ドメイン名解決が必要なリクエストをフィルターします。リクエストをインターセプトした後、HTTPDNS のドメイン名名前解決を実行します。
名前解決が完了したら、通常のリクエストと同様に URL.host フィールドと HTTPヘッダーの Host フィールドを置き換えます。その後、このリクエストのデータ送信、受信、リダイレクトなどの処理を引き継ぎます。
NSURLProtocolインターフェイスを使用して、リクエストの処理結果を元の WebView リクエストに返します。
カスタム
NSURLProtocolの実装ロジックの詳細については、提供されているデモの HttpDnsNSURLProtocolImpl.m をご参照ください。
Apple は多くのプロトコル詳細を公式に公開していないため、このソリューションを本番環境で問題なく動作させるには、Cookie やリダイレクトなどの詳細を必要に応じて処理する必要があります。特別な要件がない限り、このソリューションを使用しないでください。
5. ソリューションの概要と比較
このドキュメントでは、iOS 上の WKWebView シナリオで HTTPDNS を統合するための主な技術ソリューションとして、iOS 17 以降に基づくローカルプロキシソリューションと、グローバルな NSURLProtocol インターセプトソリューションの 2 つを紹介します。
各ソリューションには、適用シナリオ、利点、欠点、実装の複雑さがあります。迅速に判断できるよう、次の表で 2 つのソリューションを並べて比較します:
観点 / ソリューション | ローカルプロキシ (ProxyConfiguration) (iOS 17+) | グローバル NSURLProtocol インターセプト |
公式サポート | iOS 17 で Apple が導入した正式な公開 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 の恩恵を受けられます。
もう一方のソリューションには、本質的な複雑さと不確実性があります。採用は慎重に判断してください。特別な要件と深い技術的専門性を持つチームが、十分な評価と徹底したテストを行ったうえで採用する場合にのみ推奨します。