このドキュメントでは、HTTPDNS iOS SDK の統合方法と使用方法について説明します。
概要
iOS SDK は、HTTPDNS の DoH JSON API をカプセル化し、ドメイン名の名前解決機能と、Time-to-Live (TTL) および Least Recently Used (LRU) ポリシーに基づく効率的なドメイン名キャッシュ機能を提供します。この SDK を使用すると、HTTPDNS を iOS アプリに簡単に統合して、ドメイン名の名前解決例外を解決し、ドメイン名の名前解決のための正確で低コストのスケジューリングを実装できます。
iOS 14 以降、システムは 2 つの標準的な暗号化 DNS プロトコルである DNS over TLS (DoT) と DNS over HTTPS (DoH) をネイティブにサポートしています。Mobile Resolution HTTPDNS をデフォルトの暗号化 DNS リゾルバーとして設定する方法の詳細については、「iOS14 ネイティブ暗号化 DNS ソリューション」をご参照ください。
この SDK には、次の利点があります。
シンプルで使いやすい:
SDK を統合するだけで HTTPDNS サービスにアクセスできます。統合方法はシンプルで、より便利な名前解決サービスを提供します。
ゼロレイテンシ:
SDK は内部で LRU キャッシュ機構を実装し、各ドメイン名解決からの IP アドレスをローカル記憶域にキャッシュします。また、期限切れのキャッシュを積極的に更新して、キャッシュがタイムリーかつ効果的であることを保証し、ユーザーがドメイン名解決のレイテンシをゼロにするのに役立ちます。
この SDK の使用方法の詳細については、「alidns_ios_demo サンプルプロジェクトのソースコード」をご参照ください。
SDK の統合
SDK のインポート
CocoaPods を使用した統合
Podfile で、リポジトリの場所を指定します。Master リポジトリを省略しないでください。
source 'https://github.com/CocoaPods/Specs.git' source 'https://github.com/aliyun/aliyun-specs.git'プロジェクトターゲットの依存関係を追加します。
pod 'AlicloudPDNS'
手動での統合
詳細については、「SDK のダウンロード」をご参照いただき、iOS SDK を入手してください。
SDK の
pdns-sdk-ios.frameworkを取得した後、手動でプロジェクトに統合します。システムライブラリをインポートします。
Foundation.framework
SystemConfiguration.framework
CoreFoundation.framework
CoreTelephony.framework
プロジェクトのビルド設定のその他のリンカフラグセクションに -ObjC フラグを追加します。
SDK の初期化
最初にコンソールでアプリケーションを登録し、アプリケーションの一意の識別子と認証パラメータを取得してから、統合後に SDK を初期化する必要があります。
SDK をより適切に使用し、IP アドレスを解決できない状況を回避するために、できるだけ早く SDK を初期化してください。
application:didFinishLaunchingWithOptions: で SDK を初期化します。
DNSResolver *resolver = [DNSResolver share];
//setAccountId:@"******": コンソールの「アクセス設定」ページに表示されているアカウント ID を入力します
//andAccessKeyId:@"********": コンソールの「アクセス設定」で作成したキーの AccessKey ID を入力します
//andAccesskeySecret:@"********": コンソールの「アクセス設定」で作成したキーの AccessKey Secret を入力します
[resolver setAccountId:@"******" andAccessKeyId:@"********" andAccesskeySecret:@"********"];
//期限切れのキャッシュの自動更新のドメインを指定します。現在、配列内の最大 10 ドメインに制限されています
[resolver setKeepAliveDomains:@[@"ユーザー指定ドメイン 1",@"ユーザー指定ドメイン 2"]];
//後で解決が必要になる可能性のあるドメインをプリロードします
[resolver preloadDomains:@[@"domain 1", @"domain 2", @"domain 3"] complete:^{
//すべてのドメインのプリロードが完了しました
}];API の紹介
共通設定
1. アカウント ID と認証
必須パラメータ。コンソールでアプリケーションを登録すると、コンソールはこのアプリケーションに一意の識別子 [アカウント ID] を生成します。認証機能は、ユーザー ID のセキュリティを確保し、許可されていない第三者による使用を防ぎます。ユーザーは キーの作成 を参照して、コンソールで [AccessKey] を作成し、次のコードを使用してアプリで設定する必要があります。
//setAccountId:@"******": コンソールの「アクセス設定」ページに表示されているアカウント ID を入力します
//andAccessKeyId:@"********": コンソールの「アクセス設定」で作成したキーの AccessKey ID を入力します
//andAccesskeySecret:@"********": コンソールの「アクセス設定」で作成したキーの AccessKey Secret を入力します
[[DNSResolver share] setAccountId:@"******" andAccessKeyId:@"********" andAccesskeySecret:@"********"];アプリの操作中に生成されたログやデータにアカウント ID/AccessKey ID/AccessKey Secret などのパラメータが漏洩するのを防ぐために、リリースバージョンでは SDK デバッグログを無効にすることをお勧めします。
サンプルコードは、デモンストレーションのためにプロパティでアカウント ID、AccessKey ID、および AccessKey Secret を直接渡します。これらのパラメータはメーターリングと課金に密接に関連しているため、悪意のある逆コンパイルによる情報漏洩を防ぐために、本番環境ではプレーンテキストを直接渡さないでください。たとえば、プレーンテキストを事前にエンコードまたは暗号化し、値を渡すときにエンコードまたは暗号化されたプレーンテキストをデコードまたは復号化できます。同時に、アプリのコードを難読化して強化することをお勧めします。そうしないと、アカウント ID、AccessKey ID、および AccessKey Secret が逆コンパイルによって第三者に取得される可能性があります。
2. 名前解決プロトコルの設定
SDK は、DNS 解決リクエストプロトコルタイプの設定をサポートしています。HTTP または HTTPS プロトコルを介して解決することを選択でき、scheme プロパティを介して設定できます。
デフォルトでは、SDK は HTTPS プロトコルを使用して名前解決することを推奨しています。なぜなら、HTTPS はより優れたセキュリティを提供するからです。HTTPDNSは、HTTP 名前解決リクエストの数に基づいて課金されます。HTTPS 名前解決リクエストは、HTTP 名前解決リクエストの 5 倍のレートで課金されます。要件に応じてスキームタイプを選択できます。プロパティは次のように設定できます:
[DNSResolver share].scheme = DNSResolverSchemeHttps;3. キャッシュを有効にするかどうかの設定
SDK は、キャッシュ機能を有効にするように設定できます。キャッシュが有効になっている場合、ドメイン名を初めて解決した後、後続の解決ではキャッシュからデータを取得することを優先するため、解決速度を大幅に向上させることができます。
SDK はデフォルトでキャッシュを有効にします。キャッシュを無効にするには、次のコードを使用して設定する必要があります。
[DNSResolver share].cacheEnable=NO;4. ドメイン名キャッシュの保持設定
SDK でキャッシュが有効になっている場合、特定のドメインのキャッシュ保持を設定できます。この機能が有効になっている場合、SDK はこれらのドメインの期限切れのキャッシュを自動的に更新し、ユーザーキャッシュデータがタイムリーに更新されるようにします。ただし、これにより、ドメイン解決の数とクライアントのトラフィック消費が増加する可能性があります。この機能が設定されていない場合、SDK は期限切れのキャッシュを自動的に更新せず、ユーザーが解決メソッドを再度呼び出したときにのみキャッシュを更新します。特定のドメインのキャッシュ保持を設定するには、次のコードを使用します。
//現在、配列内の最大 10 ドメインに制限されています
[[DNSResolver share] setKeepAliveDomains:@[@"www.taobao.com",@"www.aliyun.com"]];利点:
レコードをタイムリーに更新できます(TTL が期限切れになる前)。
プリロードと組み合わせることで、最初の解決遅延を短縮できます(0ms)。
欠点:TTL *75% を再リクエストのタイミングとして使用すると、追加コストが発生します。
5. 事前名前解決
SDK はキャッシュを有効にするように設定できるため、ドメイン名の最初の解決によってキャッシュが生成された後、このドメイン名の後続の解決ではレイテンシが 0 になります。したがって、アプリの起動後にアプリで解決が必要になる可能性のあるドメインを事前に解決することをお勧めします。
コード例:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// アプリケーション起動後のカスタマイズのオーバーライドポイント。
DNSResolver *resolver = [DNSResolver share];
//setAccountId:@"******": コンソールの「アクセス設定」ページに表示されているアカウント ID を入力します
//andAccessKeyId:@"********": コンソールの「アクセス設定」で作成したキーの AccessKey ID を入力します
//andAccesskeySecret:@"********": コンソールの「アクセス設定」で作成したキーの AccessKey Secret を入力します
[resolver setAccountId:@"******" andAccessKeyId:@"********" andAccesskeySecret:@"********"];
resolver.cacheEnable = YES;
//後で解決が必要になる可能性のあるドメインをプリロードします
[resolver preloadDomains:@[@"domain 1", @"domain 2", @"domain 3"] complete:^{
//すべてのドメインのプリロードが完了しました
}];
return YES;
}その他の高度な設定
1. サーバー側の IPv6 アドレスを使用するかどうかの設定
HTTPDNS サービスは、IPv4 と IPv6 のデュアルスタックアクセスをサポートしています。デフォルトでは、SDK は IPv4 アドレスを使用して DNS サーバにアクセスし、名前解決を行います。
IPv6 アドレスを介して DNS サーバにアクセスして名前解決を行うには (現在のネットワークが IPv6 をサポートしている必要があります)、次のコードを使用して設定する必要があります:
[DNSResolver share].ipv6Enable = YES;2. 短縮モード
HTTPDNS の DoH JSON API は、完全な JSON フォーマットまたは簡潔な IP アドレス配列フォーマットのいずれかでデータを返します。デフォルトでは、SDK は完全な JSON フォーマットを使用します。
簡潔な IP 配列形式に設定するには、次のコードを使用する必要があります。
[DNSResolver share].shortEnable = YES;3. キャッシュサイズの設定
SDK でキャッシュが有効になっている場合、キャッシュ数(100 から 500 の範囲でサポート)をカスタマイズできます。
SDK のデフォルトのキャッシュ数は 100 ドメイン名です。キャッシュ数をカスタマイズするには、cacheCountLimit プロパティを介して設定できます。
[DNSResolver share].cacheCountLimit = 200;4. IP アドレスプローブを有効にするかどうかの設定
SDK は、IP 速度テストを有効にするように設定できます。IP 速度テストが有効になっている場合、解決結果は最速の IP アドレスを優先して返し、配列は速度テスト結果に基づいて最速から最遅にソートされます。
SDK はデフォルトでは IP 速度テストを有効にしません。IP 速度テストを有効にするには、次のコードを使用して設定する必要があります。
[DNSResolver share].speedTestEnable=YES;5. IP アドレスプローブメソッドの設定
SDK は、IP 速度テストの方法を設定できます。IP 速度テストが有効になっていて、このパラメータが 0 に設定されている場合、ICMP 検出が使用されます。このパラメータが 80、443、またはその他のサポートされているポート番号に設定されている場合、ソケット固有のポート検出が使用されます。
このパラメータのデフォルト値は 0 です。ソケット固有のポート検出を設定するには、次のコードを使用する必要があります。
[DNSResolver share].speedPort = 80;6. ISP 固有のドメイン名キャッシュの設定
SDK は、ISP ネットワークベースのドメインキャッシュの差別化を有効にするように設定できます。有効にすると、ドメインキャッシュデータは、互いに影響を与えることなく、異なるネットワーク環境に個別に保存されます。有効にしない場合、同じドメインキャッシュデータが異なるネットワークで使用されます。
SDK はデフォルトでは ISP ネットワークベースのドメインキャッシュの差別化を有効にしません。この機能を有効にするには、次のコードを使用して設定する必要があります。
[DNSResolver share].ispEnable = YES;7. ネガティブキャッシュの最大 TTL の設定
SDK は、ネガティブキャッシュの最大 TTL 時間を設定できます(ドメイン名に設定された IP アドレスがないため、解決結果に IP が返されない無効なキャッシュ)。この時間が設定されている場合、ネガティブキャッシュの最大 TTL は設定された時間を超えないように制限されます。
このパラメータのデフォルト値は 30 秒です。ネガティブキャッシュの最大 TTL 時間を設定するには、次のコードを使用する必要があります。
[DNSResolver share].maxNegativeCache = 30;8. キャッシュの最大 TTL の設定
SDK は、キャッシュの最大 TTL 時間を設定できます。この時間が設定されている場合、キャッシュの最大 TTL は設定された時間を超えないように制限されます。
このパラメータのデフォルト値は 3600 秒です。キャッシュの最大 TTL 時間を設定するには、次のコードを使用する必要があります。
[DNSResolver share].maxCacheTTL= 3600;9. 不変キャッシュを有効にするかどうかの設定
[DNSResolver share].immutableCacheEnable = NO;// 不変キャッシュはデフォルトで無効になっていますSDK には内部的に 3 つのキャッシュ更新メカニズムがあります。
不変キャッシュ:この機能が有効になっていると、キャッシュはアプリの実行中は常に有効と見なされ、キャッシュの有効期限のチェックと更新は実行されなくなります。これにより、ユーザーの解決数を最大限に最小限に抑えることができます。
設定方法:
[DNSResolver share].immutableCacheEnable = YESアクティブキャッシュ更新:アクティブ更新により、解決がキャッシュ内の最新の解決レコード値にヒットすることが保証されます。ドメイン名の権限のある解決が変更された場合、このメカニズムにより、解決リクエストがキャッシュにヒットし、DNS レイテンシが短縮されると同時に、キャッシュされた解決レコードが通常最新のレコード値であることが保証されます。現在、配列内の最大 10 ドメインに制限されています。
設定方法:
[[DNSResolver share] setKeepAliveDomains:@[@"ユーザー指定ドメイン 1",@"ユーザー指定ドメイン 2"]]パッシブキャッシュ更新:次の 2 つのメソッドを呼び出して解決結果を取得すると、キャッシュはパッシブに更新されます。
- (void)getIpv4DataWithDomain:(NSString *)domain complete:(void(^)(NSArray<NSString *> *dataArray))completeメソッド:ドメイン名解決後に IPv4 アドレス配列を取得します。キャッシュが空ではなく、TTL 有効期間内にある場合、キャッシュされた結果を直接返します。それ以外の場合、最初にネットワークリクエストを介して最新の解決結果を取得し、その結果を返してキャッシュを更新します。このメソッドは、解決結果の精度要件が高いシナリオでよく使用されます。- (NSArray<NSString *> *)getIpv4ByCacheWithDomain:(NSString *)domain andExpiredIPEnabled:(BOOL)enableメソッド:キャッシュから IPv4 解決結果を取得します。このメソッドは、enableパラメータの値に基づいて、期限切れの解決結果をキャッシュから返すかどうかを決定します。パラメータの説明:
enableがYESの場合、キャッシュの期限が切れていても古いレコードを返し(キャッシュが空の場合はnilを返します)、非同期リクエストを介してキャッシュを更新します。NOの場合、キャッシュの期限が切れているか空の場合にnilを返し、非同期リクエストを介してキャッシュを更新します。
10. タイムアウト
timeout プロパティは、ドメイン名解決のタイムアウトです。デフォルトのタイムアウトは 3 秒です。ユーザーはタイムアウトをカスタマイズでき、2 ~ 5 秒に設定することをお勧めします。
サービス API
コード例:
/// ドメイン情報を事前に解決します。プログラムの起動時に呼び出すことができ、解決結果はキャッシュに保存されて後続のドメイン名解決が高速化されます
/// ネットワーク環境(ipv4 のみ、ipv6 のみ、ipv4 と ipv6 のデュアルスタック)を自動的に検出して、現在のネットワーク環境に適した IP を解決します
/// @param domainArray ドメイン配列
/// @param complete 解決完了後のコールバック
- (void)preloadDomains:(NSArray<NSString *> *)domainArray complete:(void(^)(void))complete;
/// ドメイン名解決後に IP 配列を取得し、ネットワーク環境(ipv4 のみ、ipv6 のみ、ipv4 と ipv6 のデュアルスタック)を自動的に検出して、現在のネットワーク環境に適した IP を取得します。
/// キャッシュが有効になっている場合、キャッシュからのデータの返却を優先します。キャッシュがないか、キャッシュの期限が切れている場合は、ネットワークリクエストを介して対応する IP を取得します。キャッシュが有効になっていない場合は、ネットワークリクエストを介して対応する IP を直接取得します。
/// @param domain ドメイン名
/// @param complete コールバック(すべての IP アドレス)
- (void)getIpsDataWithDomain:(NSString *)domain complete:(void(^)(NSArray<NSString *> *dataArray))complete;
/// ネットワーク環境(ipv4 のみ、ipv6 のみ、ipv4 と ipv6 のデュアルスタック)を自動的に検出して、待機せずにキャッシュから現在のネットワーク環境に適した IP 配列を直接取得します。
/// キャッシュがない場合は nil を返します。キャッシュがあり、enable が YES に設定されている場合は、キャッシュデータをユーザーに返し、キャッシュデータの期限が切れている場合は、ドメイン名を非同期的に解決してキャッシュデータを更新します。キャッシュがあり、enable が NO に設定されている場合は、キャッシュの期限が切れているときに nil をユーザーに返し、ドメイン名を非同期的に解決してキャッシュデータを更新します。
/// @param domain ドメイン名
/// @param enable 期限切れの IP の返却を許可するかどうか
- (NSArray<NSString *> *)getIpsByCacheWithDomain:(NSString *)domain andExpiredIPEnabled:(BOOL)enable;
/// ドメイン名解決後に IPv4 情報配列を取得します
/// キャッシュが有効になっている場合、キャッシュからのデータの返却を優先します。キャッシュがないか、キャッシュの期限が切れている場合は、ネットワークリクエストを介して対応する IP を取得します。キャッシュが有効になっていない場合は、ネットワークリクエストを介して対応する IP を直接取得します。
/// @param domain ドメイン名
/// @param complete コールバック(すべてのドメイン情報)
- (void)getIpv4InfoWithDomain:(NSString *)domain complete:(void(^)(NSArray<DNSDomainInfo *> *domainInfoArray))complete;
/// ドメイン名解決後に IPv6 情報配列を取得します
/// キャッシュが有効になっている場合、キャッシュからのデータの返却を優先します。キャッシュがないか、キャッシュの期限が切れている場合は、ネットワークリクエストを介して対応する IP を取得します。キャッシュが有効になっていない場合は、ネットワークリクエストを介して対応する IP を直接取得します。
/// @param domain ドメイン名
/// @param complete コールバック(すべてのドメイン情報)
- (void)getIpv6InfoWithDomain:(NSString *)domain complete:(void(^)(NSArray<DNSDomainInfo *> *domainInfoArray))complete;
/// ドメイン名解決後に IPv4 情報を取得します
/// キャッシュが有効になっている場合、キャッシュからのデータの返却を優先します。キャッシュがないか、キャッシュの期限が切れている場合は、ネットワークリクエストを介して対応する IP を取得します。キャッシュが有効になっていない場合は、ネットワークリクエストを介して対応する IP を直接取得します。
/// @param domain ドメイン名
/// @param complete コールバック(すべてのドメイン情報からランダムに 1 つ)
- (void)getRandomIpv4InfoWithDomain:(NSString *)domain complete:(void(^)(DNSDomainInfo *domainInfo))complete;
/// ドメイン名解決後に IPv6 情報を取得します
/// キャッシュが有効になっている場合、キャッシュからのデータの返却を優先します。キャッシュがないか、キャッシュの期限が切れている場合は、ネットワークリクエストを介して対応する IP を取得します。キャッシュが有効になっていない場合は、ネットワークリクエストを介して対応する IP を直接取得します。
/// @param domain ドメイン名
/// @param complete コールバック(すべてのドメイン情報からランダムに 1 つ)
- (void)getRandomIpv6InfoWithDomain:(NSString *)domain complete:(void(^)(DNSDomainInfo *domainInfo))complete;
/// ドメイン名解決後に IPv4 アドレス配列を取得します
/// キャッシュが有効になっている場合、キャッシュからのデータの返却を優先します。キャッシュがないか、キャッシュの期限が切れている場合は、ネットワークリクエストを介して対応する IP を取得します。キャッシュが有効になっていない場合は、ネットワークリクエストを介して対応する IP を直接取得します。
/// @param domain ドメイン名
/// @param complete コールバック(すべての IP アドレス)
- (void)getIpv4DataWithDomain:(NSString *)domain complete:(void(^)(NSArray<NSString *> *dataArray))complete;
/// ドメイン名解決後に IPv6 アドレス配列を取得します
/// キャッシュが有効になっている場合、キャッシュからのデータの返却を優先します。キャッシュがないか、キャッシュの期限が切れている場合は、ネットワークリクエストを介して対応する IP を取得します。キャッシュが有効になっていない場合は、ネットワークリクエストを介して対応する IP を直接取得します。
/// @param domain ドメイン名
/// @param complete コールバック(すべての IP アドレス)
- (void)getIpv6DataWithDomain:(NSString *)domain complete:(void(^)(NSArray<NSString *> *dataArray))complete;
/// ドメイン名解決後に IPv4 アドレスを取得します
/// キャッシュが有効になっている場合、キャッシュからのデータの返却を優先します。キャッシュがないか、キャッシュの期限が切れている場合は、ネットワークリクエストを介して対応する IP を取得します。キャッシュが有効になっていない場合は、ネットワークリクエストを介して対応する IP を直接取得します。
/// @param domain ドメイン名
/// @param complete コールバック(すべての IP アドレスからランダムに 1 つ)
- (void)getRandomIpv4DataWithDomain:(NSString *)domain complete:(void(^)(NSString *data))complete;
/// ドメイン名解決後に IPv6 アドレスを取得します
/// キャッシュが有効になっている場合、キャッシュからのデータの返却を優先します。キャッシュがないか、キャッシュの期限が切れている場合は、ネットワークリクエストを介して対応する IP を取得します。キャッシュが有効になっていない場合は、ネットワークリクエストを介して対応する IP を直接取得します。
/// @param domain ドメイン名
/// @param complete コールバック(すべての IP アドレスからランダムに 1 つ)
- (void)getRandomIpv6DataWithDomain:(NSString *)domain complete:(void(^)(NSString *data))complete;
/// ドメイン IPv4 情報を事前に解決します。プログラムの起動時に呼び出すことができ、解決結果をキャッシュに保存して後続のドメイン名解決を高速化します
/// @param domainArray ドメイン配列
/// @param complete 解決完了後のコールバック
- (void)preloadIpv4Domains:(NSArray<NSString *> *)domainArray complete:(void(^)(void))complete;
/// ドメイン IPv6 情報を事前に解決します。プログラムの起動時に呼び出すことができ、解決結果をキャッシュに保存して後続のドメイン名解決を高速化します
/// @param domainArray ドメイン配列
/// @param complete 解決完了後のコールバック
- (void)preloadIpv6Domains:(NSArray<NSString *> *)domainArray complete:(void(^)(void))complete;
/// 待機せずにキャッシュから IPv4 解決結果を直接取得します。
/// キャッシュがない場合は nil を返します。キャッシュがあり、enable が YES に設定されている場合は、キャッシュデータをユーザーに返し、キャッシュデータの期限が切れている場合は、ドメイン名を非同期的に解決してキャッシュデータを更新します。キャッシュがあり、enable が NO に設定されている場合は、キャッシュの期限が切れているときに nil をユーザーに返し、ドメイン名を非同期的に解決してキャッシュデータを更新します。
/// @param domain ドメイン名
/// @param enable 期限切れの IP の返却を許可するかどうか
- (NSArray<NSString *> *)getIpv4ByCacheWithDomain:(NSString *)domain andExpiredIPEnabled:(BOOL)enable;
/// 待機せずにキャッシュから IPv6 解決結果を直接取得します。
/// キャッシュがない場合は nil を返します。キャッシュがあり、enable が YES に設定されている場合は、キャッシュデータをユーザーに返し、キャッシュデータの期限が切れている場合は、ドメイン名を非同期的に解決してキャッシュデータを更新します。キャッシュがあり、enable が NO に設定されている場合は、キャッシュの期限が切れているときに nil をユーザーに返し、ドメイン名を非同期的に解決してキャッシュデータを更新します。
/// @param domain ドメイン名
/// @param enable 期限切れの IP の返却を許可するかどうか
- (NSArray<NSString *> *)getIpv6ByCacheWithDomain:(NSString *)domain andExpiredIPEnabled:(BOOL)enable;
///統計情報収集
-(NSArray *)getRequestReportInfo;API の使用例
1. 基本情報の設定
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// アプリケーション起動後のカスタマイズのオーバーライドポイント。
//一意の初期化メソッド
DNSResolver *resolver = [DNSResolver share];
//setAccountId:@"******": コンソールの「アクセス設定」ページに表示されているアカウント ID を入力します
//andAccessKeyId:@"********": コンソールの「アクセス設定」で作成したキーの AccessKey ID を入力します
//andAccesskeySecret:@"********": コンソールの「アクセス設定」で作成したキーの AccessKey Secret を入力します
[resolver setAccountId:@"******" andAccessKeyId:@"********" andAccesskeySecret:@"********"];
//期限切れのキャッシュの自動更新のドメインを指定します。現在、配列内の最大 10 ドメインに制限されています
[resolver setKeepAliveDomains:@[@"ユーザー指定ドメイン 1",@"ユーザー指定ドメイン 2"]];
//後で解決が必要になる可能性のあるドメインをプリロードします。解決結果を事前に取得してキャッシュに保存できます
[resolver preloadDomains:@[@"domain 1", @"domain 2", @"domain 3"] complete:^{
//すべてのドメインのプリロードが完了しました
}];
return YES;
}2. ドメイン名名前解決インターフェイス
SDK は、ユーザーが選択して使用できる複数のドメイン解決メソッドを提供しており、DNSResolver.h ヘッダーファイルで確認できます。以下は、ネットワーク環境(IPv4 のみ、IPv6 のみ、IPv4 と IPv6 のデュアルスタック)を自動的に区別する解決メソッドの 1 つの例です。
インターフェース宣言:
/// ドメイン名解決後に IP 配列を取得し、ネットワーク環境(ipv4 のみ、ipv6 のみ、ipv4 と ipv6 のデュアルスタック)を自動的に区別して、現在のネットワーク環境に適した IP を取得します
/// キャッシュが有効になっている場合、キャッシュからのデータの返却を優先します。キャッシュがないか、キャッシュの期限が切れている場合は、ネットワークリクエストを介して対応する IP を取得します。キャッシュが有効になっていない場合は、ネットワークリクエストを介して対応する IP を直接取得します。
/// @param domain ドメイン名
/// @param complete コールバック(すべての IP アドレス)
- (void)getIpsDataWithDomain:(NSString *)domain complete:(void(^)(NSArray<NSString *> *dataArray))complete;インターフェース呼び出し例:
[[DNSResolver share] getIpsDataWithDomain:@"www.taobao.com" complete:^(NSArray<NSString *> *dataArray) {
//dataArray は、ドメイン名 www.taobao.com に対応する IP アドレス配列です
if (dataArray.count > 0) {
//TODO: URL 接続に IP アドレスを使用します
}
}];3. キャッシュからの名前解決結果の直接取得
インターフェース宣言:
/// ネットワーク環境(ipv4 のみ、ipv6 のみ、ipv4 と ipv6 のデュアルスタック)を自動的に区別して、待機せずにキャッシュから現在のネットワーク環境に適した IP 配列を直接取得します。
/// キャッシュがない場合は nil を返します。キャッシュがあり、enable が YES に設定されている場合は、キャッシュデータをユーザーに返し、キャッシュデータの期限が切れている場合は、ドメイン名を非同期的に解決してキャッシュデータを更新します。キャッシュがあり、enable が NO に設定されている場合は、キャッシュの期限が切れているときに nil をユーザーに返し、ドメイン名を非同期的に解決してキャッシュデータを更新します。
/// @param domain ドメイン名
/// @param enable 期限切れの IP の返却を許可するかどうか
- (NSArray<NSString *> *)getIpsByCacheWithDomain:(NSString *)domain andExpiredIPEnabled:(BOOL)enable;呼び出し例:
NSArray *result = [[DNSResolver share] getIpsByCacheWithDomain:@"ドメイン名" andExpiredIPEnabled:YES];
//キャッシュ結果を取得します
if (result.count > 0) {
//TODO: URL 接続に IP アドレスを使用します
}注:キャッシュからキャッシュ結果を直接取得する方が高速ですが、キャッシュがない場合、またはキャッシュがあってもキャッシュされた解決結果の期限が切れていて、enable が NO の場合は、結果は nil になります。
4. キャッシュの削除
インターフェース宣言:
///hostArray はクリアする必要があるホストドメイン名の配列です。すべてのデータをクリアするには、nil または空の配列を渡します
-(void)clearHostCache:(NSArray <NSString *>*)hostArray;呼び出し例:
[[DNSResolver share] clearHostCache:@[@"domain 1", @"domain 2"]];5. 統計情報の収集
インターフェース宣言:
///統計情報収集
-(NSArray *)getRequestReportInfo;呼び出し例:
NSArray *array = [[DNSResolver share] getRequestReportInfo];データ形式:
(
{
avgRtt = "1"; // 平均ドメイン解決時間(ミリ秒)
cacheDnsNum = 0; // キャッシュヒット数
domain = "www.taobao.com"; // 解決されているドメイン名
gobackLocaldnsNum = 0; // LocalDNS にダウングレードされた回数
localErro = 0; // LocalDNS 解決の失敗回数
maxRtt = "60"; // 最大ドメイン解決時間(ミリ秒)
noPermissionErro = 0; // ユーザー認証の失敗回数
noResponseErro = 0; // 応答のないリクエストタイムアウト数
requestPDnsNum = 1; // 再帰クエリの数
sp = "China Mobile"; // ISP 名
successNum = 1; // 成功した解決の数
timeoutErro = 0; // ネットワークタイムアウトエラーの数
type = 28; // IP タイプ、1 は IPv4、28 は IPv6 を表します
urlParameterErro = 0; // リクエストパラメータ形式エラーの数
urlPathErro = 0; // URL エラーの数
}
......
);注意事項
pdns-sdk-ios.frameworkは、iOS 9.0 の最小バージョンをサポートしています。リクエストに HTTP プロトコルを使用する場合、
Info.plistでApp Transport Security Settings->Allow Arbitrary LoadsをYESに設定する必要があります。HTTPDNS を介してドメイン名の IP アドレスを取得した後、クライアントはこの IP アドレスを使用してサービスリクエストを送信できます。HTTP リクエストヘッダーの Host フィールドは、元のドメイン名に設定する必要があります。
例:
//ip は元のドメイン名から解決された IP アドレスです NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"https://%@", ip]]; NSMutableURLRequest *mutableReq = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval: 10]; //ホストを設定します [mutableReq setValue:@"元のドメイン名" forHTTPHeaderField:@"host"];通常のビジネス運用を確保するために、SDK を介してドメイン名の IP が取得されない場合、開発者はフォールバックとしてリクエストに元のドメイン名アドレスを使用する必要があります。コード例は次のとおりです。
NSArray *array = [[DNSResolver share] getIpsByCacheWithDomain:@"元のドメイン名" andExpiredIPEnabled:YES]; NSString *ip = array.firstObject; if (ip.length > 0) { //URL のホストをインターフェースリクエストの IP に置き換えます }else{ //フォールバック処理を追加します(インターフェースリクエストに元の URL を使用します) }中間の HTTP プロキシが存在する場合、クライアントが開始するリクエストのリクエスト行は絶対パス URL を使用します。HTTPDNS を有効にして IP ベースの URL でアクセスすると、中間プロキシは IP 情報を識別し、それを実際のホスト情報としてターゲットサーバーに渡します。この場合、ターゲットサーバーは実際のホスト情報を含まない HTTP リクエストを処理できません。現在のデバイスでネットワークプロキシが有効になっているかどうかを確認することをお勧めします。プロキシが有効になっている場合は、ドメイン名の名前解決に HTTPDNS を使用しないでください。