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

Alibaba Cloud DNS:Unity での HTTPDNS SDK 統合のベストプラクティス

最終更新日:Dec 04, 2025

このトピックでは、Unity で HTTPDNS SDK を統合する方法について説明します。

概要

Unity はコンテンツ作成エンジンです。開発者は Unity を使用して、2D および 3D ゲーム、2D および 3D アプリケーション、仮想現実 (VR)、拡張現実 (AR)、モバイルアプリケーション、Web フロントエンド、リアルタイムの映画レンダリングソフトウェアを開発できます。Unity は、クリエイターがアイデアを現実にするのに役立ちます。

Unity 開発者が HTTPDNS ソフトウェア開発キット (SDK) を統合して使用するのを支援するために、参照用としてPdnsUnityDemo ソースコードを提供しています。このソースコードには、HTTPDNS Unity プラグインが含まれています。

重要

PdnsUnityDemo は Unity 2019.4.21f1c1 を使用して開発されています。Assets/Plugins ディレクトリにプラグインが含まれています。必要に応じて、Alibaba Cloud DNS SDK を使用してプラグインを作成することもできます。このプラグインは、カスタマイズされた Gradle ファイルと Proguard ファイルを使用します。ご利用のプロジェクトでもこれらのファイルをカスタマイズしている場合は、内容をマージする必要があります。

統合

  1. Plugins ファイルをインポートします。

PdnsUnityDemo の Plugins フォルダから、ご利用の Unity プロジェクト > Assets > Plugins フォルダにファイルをコピーします。

  1. パラメータを設定します。

AlipdnsHelper.setAccountIdAndSetAccessKeyIdAndSetAccesskeySecret("accountId","accessKeyId","accesskeySecret");
AlipdnsHelper.setCacheEnable(true);
AlipdnsHelper.setSchedulePrefetchEnable(true);
AlipdnsHelper.setIspEnable(true);
AlipdnsHelper.setMaxCacheTTL(3600);
AlipdnsHelper.setMaxNegativeCache(60);
AlipdnsHelper.setScheme(1);
AlipdnsHelper.setShortEnable(false);
AlipdnsHelper.setSpeedTestEnable(true);
AlipdnsHelper.setCacheCountLimit(100);
AlipdnsHelper.setSpeedPort(80);
// ドメイン名を事前解決
List<string> list = new List<string>();
list.Add("domain.example.com");
list.Add("another.example.com");
AlipdnsHelper.setPreloadDomains(list);

API リファレンス

インターフェースクラスは AlipdnsHelper.cs です。

  1. 必須パラメーター:`accountId`。これは、アカウント登録時にコンソールで生成される一意のアカウント ID です。

  2. 必須パラメーター:`accessKeyId` および `accessKeySecret`。これらのパラメーターは、コンソールで認証を有効にすると生成されます。認証により、ユーザー ID が保護され、不正なアクセスが防止されます。

public static void setAccountIdAndSetAccessKeyIdAndSetAccesskeySecret(string accountId,string accessKeyId,string accessKeySecret)
  1. キャッシュの有効化。ドメイン名が初めて解決された後、後続の解決ではキャッシュからのデータ取得が優先されます。これにより、解決速度が大幅に向上します。

public static void setCacheEnable(bool enable)
  1. 期限切れキャッシュのスケジュール更新の有効化/無効化。この機能を有効にすると、SDK は期限切れのキャッシュを 1 分ごとに自動的に更新します。これにより、タイムリーなキャッシュ更新が保証されますが、DNS 解決とクライアントのトラフィックが増加する可能性があります。

public static void setSchedulePrefetchEnable(bool enable)
  1. Internet Service Provider (ISP) 固有のドメイン名キャッシュの有効化/無効化。この機能を有効にすると、キャッシュデータはネットワーク環境ごとに個別に保存されます。この機能を無効にすると、すべてのネットワークで同じキャッシュが使用されます。

public static void setIspEnable(bool enable)
  1. キャッシュの最大 Time to Live (TTL) の設定。キャッシュの TTL はこの値を超えません。

    デフォルト値は 3600 秒です。

public static void setMaxCacheTTL(double maxCacheTTL)
  1. ネガティブキャッシュの最大 TTL の設定。ネガティブキャッシュの TTL はこの値を超えません。

    デフォルト値は 30 秒です。

public static void setMaxNegativeCache(double maxNegativeCache)
  1. DNS サーバにアクセスするためのプロトコルを設定します。scheme プロパティを使用して HTTP または HTTPS を指定できます。scheme のデフォルト値は HTTP の場合は 0 です。より高速な名前解決のために HTTP を使用することを推奨します。HTTPS を使用するには、scheme を 1 に設定できます。

public static void setScheme(int scheme)
  1. ショートモードの有効化/無効化。HTTPDNS の DNS-over-HTTPS (DoH) JSON API は、完全な JSON 形式または単純な IP アドレス配列のいずれかでデータを返します。デフォルトでは、SDK は完全な JSON 形式を使用します。

public static void setShortEnable(bool enable)
  1. IP アドレスのソートの有効化/無効化。この機能を有効にすると、解決結果の配列内の IP アドレスは、速度テストの結果に基づいて最速から最遅の順にソートされます。

public static void setSpeedTestEnable(bool enable)
  1. キャッシュ制限の設定。キャッシュ内のエントリの最大数を設定できます。有効な範囲は 100 から 500 です。

public static void setCacheCountLimit(int cacheCountLimit)
  1. IP アドレス速度テスト用のポートの設定。このポートはソケットプロービングに使用されます。

public static void setSpeedPort(int speedPort)
  1. ドメイン名のプリロード。SDK にはキャッシュ機能が含まれています。ドメイン名が初めて解決された後、後続の解決は大幅に高速化されます。アプリケーションの起動時に、アプリケーションが解決する必要のあるドメイン名をプリロードすることを推奨します。

public static void setPreloadDomains(List<string> hosts)
  1. 現在のネットワーク環境のキャッシュから IP アドレスを取得。このメソッドは、IPv4 のみ、IPv6 のみ、またはデュアルスタックなどのネットワーク環境を自動的に検出し、キャッシュから適切な IP アドレスのリストを即座に返します。キャッシュが空の場合、またはキャッシュが期限切れで `expiredIPEnabled` が false に設定されている場合、このメソッドは空のリストを返します。

@param host ドメイン名。

@param expiredIPEnabled 期限切れの IP アドレスを返すかどうかを指定します。

public static List<string> getIpsByCacheWithDomain(string host, bool expiredIPEnabled)
  1. キャッシュから IPv4 アドレスを取得。このメソッドは、キャッシュから IPv4 解決結果を即座に返します。キャッシュが空の場合、またはキャッシュが期限切れで `expiredIPEnabled` が false に設定されている場合、このメソッドは空のリストを返します。

@param host ドメイン名。

@param expiredIPEnabled 期限切れの IP アドレスを返すかどうかを指定します。

public static List<string> getIpv4ByCacheWithDomain(string host, bool expiredIPEnabled)
  1. キャッシュから IPv6 アドレスを取得。このメソッドは、キャッシュから IPv6 解決結果を即座に返します。キャッシュが空の場合、またはキャッシュが期限切れで `expiredIPEnabled` が false に設定されている場合、このメソッドは空のリストを返します。

@param host ドメイン名。

@param expiredIPEnabled 期限切れの IP アドレスを返すかどうかを指定します。

public static List<string> getIpv6ByCacheWithDomain(string host, bool expiredIPEnabled)
  1. HTTPDNS リクエストの統計情報を取得。このメソッドは、成功したリクエストと失敗したリクエストに関する情報を返します。

public static string getRequestReportInfo()

ベストプラクティス

仕組み

この例は、Unity に HTTPDNS を統合するための完全なソリューションを示しています:

  1. クロスプラットフォーム統一インターフェイス: AlipdnsHelper を使用して、統一 API を提供します。

  2. プラットフォーム固有の実装:iOS および Android SDK 用に異なる基盤実装を提供します。

  3. 自動 DNS 置換:ネットワークリクエストの前に、ドメイン名を解決された IP アドレスに自動的に置き換えます。

  4. Host ヘッダーの設定:HTTPS/SSL 接続に対して正しい Server Name Indication (SNI) が設定されることを保証します。

ネットワークリクエストの統合

異なるネットワークモジュールを使用してリクエストを送信する場合、リクエストヘッダーを設定する必要があります。以下のセクションでは、`HttpClient`、`HttpWebRequest`、および `UnityWebRequest` の例を示します。

HttpClient

using System;
using System.Net.Http;
using UnityEngine;

public class AlipdnsHttpClient : MonoBehaviour
{
    private static readonly HttpClient httpClient = new HttpClient();
    
    public async void MakeRequest(string url)
    {
        try
        {
            var uri = new Uri(url);
            string hostname = uri.Host;
            
            // HTTPDNS を使用してドメイン名を解決
	    var result = AlipdnsHelper.getIpsByCacheWithDomain(hostname, true);
            if (result != null && result.Count > 0)
            {
                string resolvedIP = result[0];
                string newUrl = url.Replace(hostname, resolvedIP);
                
                using (var requestMessage = new HttpRequestMessage(HttpMethod.Get, newUrl))
                {
                    // 重要:SSL/SNI の正しさを保証するために Host ヘッダーを設定
                    requestMessage.Headers.Host = hostname;
                    
                    var response = await httpClient.SendAsync(requestMessage);
                    string content = await response.Content.ReadAsStringAsync();
                    
                    Debug.Log($"Request successful: {response.StatusCode}");
                }
            }
        }
        catch (Exception e)
        {
            Debug.LogError($"Request failed: {e.Message}");
        }
    }
}

HttpWebRequest

using System;
using System.IO;
using System.Net;
using UnityEngine;

public class AlipdnsWebRequest : MonoBehaviour
{
    public void MakeRequest(string url)
    {
        try
        {
            var uri = new Uri(url);
            string hostname = uri.Host;
            
            // HTTPDNS を使用してドメイン名を解決
            var result = AlipdnsHelper.getIpsByCacheWithDomain(hostname, true);
            if (result != null && result.Count > 0)
            {
                string resolvedIP = result[0];
                string newUrl = url.Replace(hostname, resolvedIP);
                
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(newUrl);
                request.Method = "GET";
                // 重要:SSL/SNI の正しさを保証するために Host ヘッダーを設定
                request.Host = hostname;
                
                using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                using (Stream stream = response.GetResponseStream())
                using (StreamReader reader = new StreamReader(stream))
                {
                    string content = reader.ReadToEnd();
                    Debug.Log($"Request successful: {response.StatusCode}");
                }
            }
        }
        catch (Exception e)
        {
            Debug.LogError($"Request failed: {e.Message}");
        }
    }
}

UnityWebRequest (非推奨)

重要

`UnityWebRequest` は SNI 情報を正しく設定できないため、サーバーが特定のドメイン名証明書を返すために SNI に依存している場合、SSL 検証が失敗します。したがって、このタイプのドメイン名を処理するには、他の 2 つのネットワークリクエストメソッドを使用することを推奨します。

using System;
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;

public class AlipdnsUnityWebRequest : MonoBehaviour
{
    public IEnumerator MakeRequest(string url)
    {
        var uri = new Uri(url);
        string hostname = uri.Host;
        
        // HTTPDNS を使用してドメイン名を解決
        var result = AlipdnsHelper.getIpsByCacheWithDomain(hostname, true);
        if (result != null && result.Count > 0)
        {
            string resolvedIP = result[0];
            string newUrl = url.Replace(hostname, resolvedIP);
            
            using (UnityWebRequest request = UnityWebRequest.Get(newUrl))
            {
                // 重要:Host ヘッダーを設定
                request.SetRequestHeader("Host", hostname);
                
                yield return request.SendWebRequest();
                
                if (request.result == UnityWebRequest.Result.Success)
                {
                    Debug.Log($"Request successful: {request.responseCode}");
                }
                else
                {
                    Debug.LogError($"Request failed: {request.error}");
                }
            }
        }
    }
}

説明
  1. このドキュメントは、Unity で Android および iOS 用の HTTPDNS SDK を使用する場合にのみ適用されます。

  2. Unity で Android および iOS 用の HTTPDNS SDK を統合して使用する方法の詳細については、「Android SDK 開発ガイド」および「iOS SDK 開発ガイド」をご参照ください。

  3. Unity で Android および iOS 用の HTTPDNS SDK を統合するための完全なサンプルコードについては、「PdnsUnityDemo ソースコード」をご参照ください。