このトピックでは、Flutter SDK を使用して HTTPDNS を統合する方法について説明します。HTTPDNS 統合の基本原則については、「クライアント統合の概要」をご参照ください。
Flutter は、Google が提供するオープンソースのアプリケーション開発フレームワークです。単一のコードベースから、美しく、ネイティブコンパイルされた、マルチプラットフォームのアプリケーションを構築できます。
Alibaba Cloud は、ネイティブプラットフォームの SDK を必要としない、純粋な Dart で実装された HTTPDNS SDK を提供しています。このトピックでは、一般的な Flutter ネットワークフレームワークに HTTPDNS を統合して使用する方法も示します。この SDK は GitHub および pub.dev で入手できます。
以下のセクションでは、SDK を使用するための手順とベストプラクティスについて説明します。
1. クイックスタート
1.1. サービスのアクティベーション
HTTPDNS をアクティベートするには、「クイックスタート」をご参照ください。
1.2. 設定の取得
EMAS コンソールの開発設定から AccountId、SecretKey、および AESSecretKey を取得します。この情報は、ソフトウェア開発キット (SDK) を初期化するために必要です。詳細については、「開発設定」をご参照ください。
2. インストールと設定
2.1. Flutter 依存関係の追加
Flutter プロジェクトの pubspec.yaml ファイルに、次の依存関係を追加します。
dependencies:
flutter:
sdk: flutter
aliyun_httpdns: ^2.0.0 # SDK のリリースノートから最新のバージョン番号を取得します
dio: ^5.9.0 # Dio ネットワークライブラリ
http: ^1.2.0 # http パッケージ依存関係を追加した後、flutter pub get を実行します。
バージョン 2.0.0 以降、この SDK は純粋な Dart 実装です。ネイティブの Android または iOS の依存関係は不要で、インストール後すぐに使用できます。
3. 設定と使用方法
3.1. 初期化設定
アプリケーションの起動後、HTTPDNS 機能を使用する前にプラグインを初期化する必要があります。初期化プロセスでは、AccountId、SecretKey、その他の設定を行い、機能を有効にします。次のコードは例です。
// HTTPDNS の初期化
final config = AliyunHttpdnsConfig(
accountId: ご利用のアカウント ID,
secretKey: 'ご利用の SecretKey',
httpsEnabled: true,
persistentCacheEnabled: true,
reuseExpiredIPEnabled: true,
preResolveAfterNetworkChanged: true,
ipRankingDatasource: {
'www.aliyun.com': 443,
},
);
await AliyunHttpdns.init(config);
// ログの有効化 (オプション)
AliyunHttpdns.setLogEnabled(true);
// 事前解決ホストの設定
await AliyunHttpdns.setPreResolveHosts(['www.aliyun.com'], ipType: HttpdnsIpType.auto);3.1.1. ログ設定
アプリケーション開発中に HTTPDNS ログを出力するには、ログ出力制御メソッドを呼び出してログを有効にします。次のコードは例です。
AliyunHttpdns.setLogEnabled(true);
// カスタムログハンドラー (オプション)
AliyunHttpdns.setLogHandler((message) {
print(message);
});3.1.2. SessionId の記録
アプリケーションの実行中に、メソッドを呼び出して sessionId を取得し、アプリケーションのデータ収集システムに記録できます。sessionId は、単一のアプリケーション実行を識別します。オンラインでのトラブルシューティング中に、特定の実行の名前解決ログをクエリするために使用できます。次のコードは例です。
final sessionId = AliyunHttpdns.getSessionId();
print("SessionId = $sessionId");3.2. ドメイン名の名前解決
3.2.1. 事前解決
事前にドメイン名を解決する必要がある場合は、事前解決メソッドを呼び出すことができます。次のコードは例です。
await AliyunHttpdns.setPreResolveHosts(["www.aliyun.com", "www.example.com"], ipType: HttpdnsIpType.auto);呼び出し後、SDK はドメイン名の名前解決を開始し、結果をメモリにキャッシュします。後続のリクエストでは、キャッシュされた結果を使用できます。
3.2.2. ドメイン名の名前解決
ドメイン名を解決する必要がある場合は、ドメイン名解決メソッドを呼び出して IP アドレスを取得できます。次のコードは例です。
Future<void> _resolve() async {
final result = await AliyunHttpdns.resolveHostSyncNonBlocking('www.aliyun.com', ipType: HttpdnsIpType.auto);
final ipv4List = result?.ips ?? [];
final ipv6List = result?.ipv6s ?? [];
print('IPv4: $ipv4List');
print('IPv6: $ipv6List');
}4. Flutter のベストプラクティス
4.1. 仕組み
この例では、カスタム HTTP クライアントアダプターを実装することで、HTTPDNS をより直接的に統合する方法を示します。
カスタム HTTP クライアントアダプターを作成して、ネットワークリクエストをインターセプトします。
アダプター内で、HTTPDNS プラグインを呼び出してドメイン名を IP アドレスに解決します。
解決された IP アドレスを使用して、直接のソケット接続を作成します。
HTTPS 接続の場合、サーバー名表示 (SNI) が元のドメイン名に正しく設定されていることを確認します。
この方法は、HTTPDNS 機能を HTTP クライアントレベルで直接統合し、シンプルで効率的な実装を実現します。
4.2. 例
この例では、HTTPDNS 機能を統合する方法を示す完全な Flutter アプリケーションを提供します。
4.2.1. カスタム HTTP クライアントアダプターの実装
カスタムアダプターの実装については、lib/net/httpdns_http_client_adapter.dart ファイルをご参照ください。このソリューションは EMAS チームによって設計および実装されました。このソリューションを参照する場合は、出典を明記してください。アダプターは HTTP リクエストをインターセプトし、HTTPDNS を呼び出してドメイン名を解決し、解決された IP アドレスを使用してソケット接続を作成します。
この例では、Dio、HttpClient、http パッケージの 3 つのネットワークライブラリをサポートしています。コードは次のとおりです。
import 'dart:io';
import 'package:dio/io.dart';
import 'package:http/http.dart' as http;
import 'package:http/io_client.dart';
import 'package:flutter/foundation.dart';
import 'package:aliyun_httpdns/aliyun_httpdns.dart';
// Dio アダプター
IOHttpClientAdapter buildHttpdnsHttpClientAdapter() {
final HttpClient client = HttpClient();
_configureHttpClient(client);
_configureConnectionFactory(client);
final IOHttpClientAdapter adapter = IOHttpClientAdapter(createHttpClient: () => client)
..validateCertificate = (cert, host, port) => true;
return adapter;
}
// ネイティブ HttpClient
HttpClient buildHttpdnsNativeHttpClient() {
final HttpClient client = HttpClient();
_configureHttpClient(client);
_configureConnectionFactory(client);
return client;
}
// http パッケージアダプター
http.Client buildHttpdnsHttpPackageClient() {
final HttpClient httpClient = buildHttpdnsNativeHttpClient();
return IOClient(httpClient);
}
// HttpClient の基本設定
void _configureHttpClient(HttpClient client) {
client.findProxy = (Uri _) => 'DIRECT';
client.idleTimeout = const Duration(seconds: 30);
client.maxConnectionsPerHost = 8;
}
// HTTPDNS に基づく接続ファクトリの設定
// このソリューションは EMAS チームによって設計および実装されました。参照する場合は、出典を明記してください。
void _configureConnectionFactory(HttpClient client) {
client.connectionFactory = (Uri uri, String? proxyHost, int? proxyPort) async {
final String domain = uri.host;
final bool https = uri.scheme.toLowerCase() == 'https';
final int port = uri.port == 0 ? (https ? 443 : 80) : uri.port;
final List<InternetAddress> targets = await _resolveTargets(domain);
final Object target = targets.isNotEmpty ? targets.first : domain;
if (!https) {
return Socket.startConnect(target, port);
}
// HTTPS:最初に TCP、次に TLS (SNI=ドメイン名)、キャンセル可能に保つ
bool cancelled = false;
final Future<ConnectionTask<Socket>> rawStart = Socket.startConnect(target, port);
final Future<Socket> upgraded = rawStart.then((task) async {
final Socket raw = await task.socket;
if (cancelled) {
raw.destroy();
throw const SocketException('Connection cancelled');
}
final SecureSocket secure = await SecureSocket.secure(
raw,
host: domain, // 重要:元のドメイン名を SNI として使用します
);
if (cancelled) {
secure.destroy();
throw const SocketException('Connection cancelled');
}
return secure;
});
return ConnectionTask.fromSocket(
upgraded,
() {
cancelled = true;
try {
rawStart.then((t) => t.cancel());
} catch (_) {}
},
);
};
}
// HTTPDNS を介してターゲット IP リストを解決
Future<List<InternetAddress>> _resolveTargets(String domain) async {
try {
final result = await AliyunHttpdns.resolveHostSyncNonBlocking(domain, ipType: HttpdnsIpType.auto);
final List<String> ipv4 = result?.ips ?? [];
final List<String> ipv6 = result?.ipv6s ?? [];
final List<InternetAddress> targets = [
...ipv4.map(InternetAddress.tryParse).whereType<InternetAddress>(),
...ipv6.map(InternetAddress.tryParse).whereType<InternetAddress>(),
];
if (targets.isEmpty) {
debugPrint('[dio] HTTPDNS no result for $domain, fallback to system DNS');
} else {
debugPrint('[dio] HTTPDNS resolved $domain -> ${targets.first.address}');
}
return targets;
} catch (e) {
debugPrint('[dio] HTTPDNS resolve failed: $e, fallback to system DNS');
return const <InternetAddress>[];
}
}4.2.2. アダプターの統合と使用方法
アダプターの統合については、lib/main.dart ファイルをご参照ください。まず、HTTPDNS を初期化します。次に、カスタムアダプターを使用するようにネットワークライブラリを設定します。次のコードは例です。
class _MyHomePageState extends State<MyHomePage> {
late final Dio _dio;
late final HttpClient _httpClient;
late final http.Client _httpPackageClient;
@override
void initState() {
super.initState();
// HTTPDNS の初期化
_initHttpDnsOnce();
// HTTPDNS アダプターを使用するようにネットワークライブラリを設定
_dio = Dio();
_dio.httpClientAdapter = buildHttpdnsHttpClientAdapter();
_dio.options.headers['Connection'] = 'keep-alive';
_httpClient = buildHttpdnsNativeHttpClient();
_httpPackageClient = buildHttpdnsHttpPackageClient();
}
Future<void> _initHttpDnsOnce() async {
try {
final config = AliyunHttpdnsConfig(
accountId: ご利用のアカウント ID,
secretKey: 'ご利用の SecretKey',
httpsEnabled: true,
reuseExpiredIPEnabled: true,
);
await AliyunHttpdns.init(config);
AliyunHttpdns.setLogEnabled(true);
// 事前解決ホストの設定
await AliyunHttpdns.setPreResolveHosts(['www.aliyun.com'], ipType: HttpdnsIpType.auto);
} catch (e) {
debugPrint('[httpdns] init failed: $e');
}
}
}設定されたネットワークライブラリを使用してリクエストを行うと、自動的に HTTPDNS を使用してドメイン名を解決します。
// Dio の使用
final response = await _dio.get('https://www.aliyun.com');
// HttpClient の使用
final request = await _httpClient.getUrl(Uri.parse('https://www.aliyun.com'));
final response = await request.close();
// http パッケージの使用
final response = await _httpPackageClient.get(Uri.parse('https://www.aliyun.com'));4.2.3. リソースのクリーンアップ
コンポーネントが破棄される際には、関連するリソースをクリーンアップする必要があります。
@override
void dispose() {
_urlController.dispose();
_httpClient.close();
_httpPackageClient.close();
super.dispose();
}5. API
5.1. ログ出力の制御
ログをコンソールに出力するかどうかを制御します。
AliyunHttpdns.setLogEnabled(true);5.2. 初期化
このメソッドは設定を初期化し、アプリケーションの起動時に呼び出す必要があります。
// 設定の作成
final config = AliyunHttpdnsConfig(
accountId: ご利用のアカウント ID, // 必須
secretKey: 'your_secret_key', // オプション
aesSecretKey: 'your_aes_secret_key', // オプション
region: HttpdnsRegion.cn, // デフォルト:中国本土
httpsEnabled: true, // デフォルト:true
persistentCacheEnabled: true, // 永続キャッシュ
reuseExpiredIPEnabled: true, // 期限切れ IP の再利用
preResolveAfterNetworkChanged: true, // ネットワーク変更後の事前解決
ipRankingDatasource: { // IP 優先順位付け設定 (オプション)
'www.aliyun.com': 443,
},
timeout: 2, // リクエストタイムアウト (秒)
);
// SDK の初期化
await AliyunHttpdns.init(config);
// ログの有効化 (オプション)
AliyunHttpdns.setLogEnabled(true);初期化パラメーター:
パラメーター名 | 型 | 必須 | 機能 |
accountId | int | 必須パラメーター | アカウント ID |
secretKey | String? | オプションパラメーター | 署名を追加するためのキー。 |
aesSecretKey | String? | オプションパラメーター | データを暗号化するためのキー。 |
region | HttpdnsRegion | オプションパラメーター | エンドポイントがデプロイされているエリア。デフォルト:cn。 |
httpsEnabled | bool | オプションパラメーター | HTTPS 名前解決リンクを使用するかどうかを指定します。デフォルト:true。 |
persistentCacheEnabled | bool | オプションパラメーター | 永続キャッシュを有効にするかどうかを指定します。デフォルト:false。 |
reuseExpiredIPEnabled | bool | オプションパラメーター | 期限切れの IP アドレスの再利用を許可するかどうかを指定します。デフォルト:false。 |
preResolveAfterNetworkChanged | bool | オプションパラメーター | ネットワークが変更されたときに名前解決を自動的に更新するかどうかを指定します。デフォルト:false。 |
discardExpiredAfterSeconds | int? | オプションパラメーター | キャッシュデータを破棄する有効期限 (秒単位)。 |
ipRankingDatasource | Map<String, int>? | オプションパラメーター | IP 優先順位付け設定。ドメイン名とポートのマップ。 |
timeout | int | オプションパラメーター | リクエストタイムアウト期間 (秒単位)。デフォルト:2。 |
5.3. ドメイン名の名前解決
指定されたドメイン名を解決します。SDK は 3 つの解決メソッドを提供します。
5.3.1 同期非ブロッキング解決 (推奨)
キャッシュされた結果を即座に返します。キャッシュにヒットしない場合は null を返し、バックグラウンドでリクエストを開始します。
final result = await AliyunHttpdns.resolveHostSyncNonBlocking(
'www.aliyun.com',
ipType: HttpdnsIpType.auto,
);
// SDNS パラメーター付き
final result2 = await AliyunHttpdns.resolveHostSyncNonBlocking(
'www.aliyun.com',
ipType: HttpdnsIpType.auto,
sdnsParams: {'key': 'value'},
cacheKey: 'custom_cache_key',
);5.3.2 同期ブロッキング解決
結果が取得されるか、リクエストがタイムアウトするまでブロックします。
final result = await AliyunHttpdns.resolveHostSync(
'www.aliyun.com',
ipType: HttpdnsIpType.auto,
);
// SDNS パラメーター付き
final result2 = await AliyunHttpdns.resolveHostSync(
'www.aliyun.com',
ipType: HttpdnsIpType.auto,
sdnsParams: {'key': 'value'},
cacheKey: 'custom_cache_key',
);5.3.3 非同期コールバック解決
コールバック関数を介して解決結果を返します。
await AliyunHttpdns.resolveHostAsync(
'www.aliyun.com',
ipType: HttpdnsIpType.auto,
callback: (result) {
print('Resolution result: $result');
},
);
// SDNS パラメーター付き
await AliyunHttpdns.resolveHostAsync(
'www.aliyun.com',
ipType: HttpdnsIpType.auto,
sdnsParams: {'key': 'value'},
cacheKey: 'custom_cache_key',
callback: (result) {
print('Resolution result: $result');
},
);パラメーターの説明
パラメーター名 | 型 | 必須 | 機能 |
host | String | 必須パラメーター | 解決するドメイン名。 |
ipType | HttpdnsIpType | オプションパラメーター | 要求された IP タイプ:auto、v4、v6、または both。 |
sdnsParams | Map<String, String>? | オプションパラメーター | カスタム解像度の SDNS パラメーター。 |
cacheKey | String? | このパラメーターはオプションです。 | カスタムキャッシュキー。 |
返されるデータ構造 (ResolveResult)
フィールド名 | 型 | 機能 |
host | String | ドメイン名。 |
ips | List | IPv4 アドレスのリスト。 |
ipv6s | List | IPv6 アドレスのリスト。 |
ttl | int | IPv4 の TTL (秒単位)。 |
v6ttl | int | IPv6 の TTL (秒単位)。 |
5.4. ドメイン名の事前解決
1 つ以上のドメイン名を事前解決し、結果を SDK にキャッシュします。これらのドメインに対する後続の解決リクエストは、キャッシュから直接結果を取得できるため、解決速度が向上します。
await AliyunHttpdns.setPreResolveHosts(
["www.aliyun.com"],
ipType: HttpdnsIpType.auto
);パラメーター:
パラメーター名 | 型 | 必須 | 機能 |
hosts | List | 必須パラメーター | 事前解決するドメイン名のリスト。 |
ipType | HttpdnsIpType | オプションパラメーター | 要求された IP タイプ:auto、v4、v6、または both。 |
5.5. SessionId の取得
トラブルシューティングや問題の追跡に使用される SessionId を取得します。
final sessionId = await AliyunHttpdns.getSessionId();
print("SessionId = $sessionId");パラメーターは不要です。現在のセッション ID を返します。
5.6. キャッシュのクリア
DNS 解決キャッシュをクリアします。
// すべてのキャッシュをクリア
await AliyunHttpdns.cleanHostCache(null);
// 指定されたドメイン名のキャッシュをクリア
await AliyunHttpdns.cleanHostCache(['www.aliyun.com']);5.7. ネットワーク変更時の事前解決ドメインの自動更新
ネットワーク環境が変更されたときに、事前解決されたドメイン名のキャッシュを自動的に更新するかどうかを設定します。これは初期化設定を通じて設定されます。
final config = AliyunHttpdnsConfig(
accountId: ご利用のアカウント ID,
secretKey: 'your_secret_key',
preResolveAfterNetworkChanged: true, // ネットワーク変更時の自動更新
);
await AliyunHttpdns.init(config);5.8. 永続キャッシュ設定
永続キャッシュ機能を有効にするかどうかを設定します。有効にすると、SDK は解決結果をローカルデバイスに保存します。アプリの再起動後、ローカルデバイスからキャッシュされた結果を読み込むことができます。これは初期化設定を通じて設定されます。
final config = AliyunHttpdnsConfig(
accountId: ご利用のアカウント ID,
secretKey: 'your_secret_key',
persistentCacheEnabled: true, // 永続キャッシュを有効にする
discardExpiredAfterSeconds: 86400, // オプション、1 日以上期限切れのキャッシュを破棄
);
await AliyunHttpdns.init(config);パラメーター:
パラメーター名 | 型 | 必須 | 機能 |
persistentCacheEnabled | bool | オプションパラメーター | 永続キャッシュを有効にするかどうかを指定します。デフォルト:false。 |
discardExpiredAfterSeconds | int? | オプションパラメーター | 有効期限のしきい値 (秒単位)。アプリの起動時に、この期間を超えて期限切れになっているキャッシュレコードを破棄します。 |
5.9 IP 優先度
IP 優先順位付けを実行するドメイン名のリストを指定します。有効にすると、SDK は解決された IP アドレスに対して TCP 速度テストを実行し、それらをソートして、リストの最初の IP アドレスが最高の可用性を持つようにします。これは初期化設定を通じて設定されます。
final config = AliyunHttpdnsConfig(
accountId: ご利用のアカウント ID,
secretKey: 'your_secret_key',
ipRankingDatasource: {
'www.aliyun.com': 443,
},
);
await AliyunHttpdns.init(config);パラメーター:
パラメーター名 | 型 | 必須 | 機能 |
ipRankingDatasource | Map<String, int>? | オプションパラメーター | ドメイン名とポートのマップ。例:{'www.aliyun.com': 443}。 |
5.10 カスタム TTL
コールバック関数を設定して、解決結果の TTL を変更できます。
AliyunHttpdns.setTtlChanger((host, ipType, ttl) {
// 変更された TTL を返す
return ttl * 2;
});5.11 SDNS グローバルパラメーター
グローバル SDNS パラメーターを設定します。すべての解決リクエストにこれらのパラメーターが付与されます。
AliyunHttpdns.setSdnsGlobalParams({
'key1': 'value1',
'key2': 'value2',
});5.12 署名時刻の補正
クライアントの時刻がサーバーの時刻と一致しない場合、このメソッドを使用して時刻を調整できます。
AliyunHttpdns.setAuthCurrentTime(serverTimestamp);6. バージョンアップグレードガイド
6.1 バージョン 1.x から 2.0.0 へのアップグレードガイド
バージョン 2.0.0 は、純粋な Dart 実装にリファクタリングされました。主な利点は次のとおりです。
Android または iOS のネイティブ SDK への依存がなくなり、プロジェクト設定とバージョン管理が簡素化されます。
クロスプラットフォームでの動作が一貫しており、デバッグとメンテナンスが容易になります。
パッケージサイズが削減され、ネイティブブリッジのオーバーヘッドがありません。
このアップグレードには、主に初期化メソッドとパラメーターの型に関するいくつかの API の変更が含まれます。以下の手順に従ってアップグレードを完了してください。
詳細なアップグレード手順
1. 依存関係のバージョンの更新
pubspec.yaml
dependencies:aliyun_httpdns: ^2.0.0更新を実行します。
flutter pub upgrade aliyun_httpdnsバージョン 2.0.0 は純粋な Dart 実装です。プロジェクト内のネイティブ SDK に関連する設定、たとえば build.gradle の HTTPDNS 依存関係や podspec の AlicloudHTTPDNS 依存関係などを削除できます。
2. 初期化コードのリファクタリング
アップグレード前 (1.x)
// 1.x: 2段階の初期化
await AliyunHttpdns.init(
accountId: ご利用のアカウント ID,
secretKey: "your_secret_key",
aesSecretKey: "your_aes_key",
);
await AliyunHttpdns.setHttpsRequestEnabled(true);
await AliyunHttpdns.setPersistentCacheIPEnabled(true);
await AliyunHttpdns.setReuseExpiredIPEnabled(true);
await AliyunHttpdns.setPreResolveAfterNetworkChanged(true);
await AliyunHttpdns.setIPRankingList({'www.aliyun.com': 443});
await AliyunHttpdns.build();アップグレード後 (2.0)
final config = AliyunHttpdnsConfig(
accountId: ご利用のアカウント ID,
secretKey: 'your_secret_key',
aesSecretKey: 'your_aes_key',
httpsEnabled: true,
persistentCacheEnabled: true,
reuseExpiredIPEnabled: true,
preResolveAfterNetworkChanged: true,
ipRankingDatasource: {'www.aliyun.com': 443},
);
await AliyunHttpdns.init(config);注:
すべての機能設定は
AliyunHttpdnsConfigコンストラクターのパラメーターに統合されました。build()メソッドを呼び出す必要はなくなりました。region、timeout、discardExpiredAfterSecondsなどの新しい設定パラメーターが追加されました。
3. 名前解決 API の更新
アップグレード前 (1.x)
final res = await AliyunHttpdns.resolveHostSyncNonBlocking(
'www.aliyun.com',
ipType: 'both',
);
final ipv4s = res['ipv4'] ?? [];
final ipv6s = res['ipv6'] ?? [];スペックアップ後(2.0)
final result = await AliyunHttpdns.resolveHostSyncNonBlocking(
'www.aliyun.com',
ipType: HttpdnsIpType.auto,
);
final ipv4s = result?.ips ?? [];
final ipv6s = result?.ipv6s ?? [];注意事項:
ipTypeは、文字列からHttpdnsIpType列挙 (auto、v4、v6、both) に変更されました。戻り値 は
Map<String, List<String>>からResolveResult?オブジェクト に変更されます。フィールド名 は
ipv4/ipv6からips/ipv6sに変更されます。2つの新しい解決メソッドである
resolveHostSyncとresolveHostAsyncが追加されます。
4. 事前解決 API の更新
アップグレード前 (1.x)
await AliyunHttpdns.setPreResolveHosts(['www.aliyun.com']);スペックアップ後 (2.0)
await AliyunHttpdns.setPreResolveHosts(['www.aliyun.com']);5. カスタムログハンドラーの追加
AliyunHttpdns.setLogHandler((message) {
print(message);
});6. キャッシュクリア API の更新
アップグレード前 (1.x)
await AliyunHttpdns.cleanAllHostCache();スペックアップ後(2.0)
// すべてのキャッシュをクリア
await AliyunHttpdns.cleanHostCache(null);
// 指定されたドメイン名のキャッシュをクリア(新規)
await AliyunHttpdns.cleanHostCache(['www.aliyun.com']);アプリケーションが変更された API のいずれも使用していない場合は、何もする必要はありません。
API アップグレードマッピングテーブル (1.x → 2.0)
API カテゴリ | 1.x | 2.0 |
初期化 |
|
|
HTTPS リクエストの有効化 |
|
|
期限切れ IP の有効化 |
|
|
ローカルキャッシュの有効化 |
|
|
ネットワーク変更時の事前解決 |
|
|
優先 IP |
|
|
サービスのビルド |
| 不要 |
同期非ブロッキング解決 |
|
|
同期ブロッキング解決 | なし |
|
非同期コールバック解決 | なし |
|
戻り値 |
|
|
事前解決ホストの設定 |
|
|
キャッシュのクリア |
|
|
カスタム TTL | なし |
|
SDNS グローバルパラメーター | なし |
|
カスタムログハンドラー | なし |
|
正しい署名時間 | なし |
|
6.2 バージョン 0.x から 1.0.0 へのアップグレードガイド
バージョン 1.0.0 では、包括的なアーキテクチャのリファクタリングと API の最適化が導入されました。このアップグレードの目的は次のとおりです。
設定パターンの統一:散在するランタイム設定から、2段階の初期化パターン (init + build) に移行します。これにより、設定のタイミングの問題が解決され、SDK の安定性が向上します。
解決 API の標準化:解決 API アーキテクチャを再設計し、統一された
resolveHostSyncNonBlockingメソッドを提供します。このメソッドは、JSON 文字列の代わりに構造化データを返します。静的メソッドによる設計:シングルトンパターンから静的メソッド呼び出しに切り替えます。これにより、使用が簡素化され、インスタンスを作成する必要がなくなります。
パフォーマンスの最適化:API の最適化と内部実装の強化により、解決パフォーマンスとリソース使用効率が向上します。
これは後方互換性のない大きな変更です。変更は重要ですが、アプリケーションが使用する API を変更するだけで済みます。以下のアップグレード手順と新旧 API マッピングテーブルは、この重要なアップグレードを体系的に完了するのに役立ちます。
詳細なアップグレード手順
1. 依存関係のバージョンの更新
pubspec.yaml
dependencies:aliyun_httpdns: ^1.0.0更新を実行します。
flutter pub upgrade aliyun_httpdns2. 初期化コードのリファクタリング
アップグレード前
// 旧バージョン:シングルトンパターン + 1段階の初期化
final _aliyunHttpDns = AliyunHttpDns();
await _aliyunHttpDns.init(
"YOUR_ACCOUNT_ID", // String 型
secretKey: "your_secret_key",
aesSecretKey: "your_aes_key",
region: "",
timeout: 2000,
enableHttps: true,
enableExpireIp: true,
enableCacheIp: true,
enableDegradationLocalDns: true,
preResolveAfterNetworkChanged: true,
ipRankingMap: {"www.aliyun.com": 80},
sdnsGlobalParam: {"aa": "bb"},
bizTags: ["tag1", "tag2"]
);スペックアップ後
// 新しいバージョン: 静的メソッド + 2 段階の初期化
// ステージ 1: 基本構成を初期化する
await AliyunHttpdns.init(
accountId: your_account_id, // int 型、必須
secretKey: "your_secret_key", // 任意
aesSecretKey: "your_aes_key", // 任意
);
// ステージ 2: 機能オプションを設定する
await AliyunHttpdns.setHttpsRequestEnabled(true); // enableHttps に置き換え
await AliyunHttpdns.setLogEnabled(true); // enableLog に置き換え
await AliyunHttpdns.setPersistentCacheIPEnabled(true); // enableCacheIp に置き換え
await AliyunHttpdns.setReuseExpiredIPEnabled(true); // enableExpireIp に置き換え
await AliyunHttpdns.setPreResolveAfterNetworkChanged(true); // preResolveAfterNetworkChanged に置き換え
// ステージ 3: サービスをビルドする (必ず呼び出す必要があります)
await AliyunHttpdns.build();注意事項:
region、timeout、enableDegradationLocalDns、ipRankingMap、sdnsGlobalParam、およびbizTagsの各パラメーターは削除されました。新しい
build()メソッドが追加されました。これは、構成が完了した後に呼び出す必要があります。すべてのメソッドは静的になりました。インスタンスを作成する必要はありません。
3. 名前解決 API の更新
アップグレード前
// 同期非ブロッキング、JSON 文字列を返す
String result = await _aliyunHttpDns.resolve(
"YOUR_ACCOUNT_ID", // accountId
"www.aliyun.com", // host
kRequestIpv4AndIpv6, // requestIpType
);
// 手動での JSON 解析が必要
Map<String, dynamic> map = json.decode(result);
List<String> ipv4s = List<String>.from(map['ipv4'] ?? []);
List<String> ipv6s = List<String>.from(map['ipv6'] ?? []);
// 最初の IP を使用
String ip = ipv4s.isNotEmpty ? ipv4s.first : '';スペックアップ後
// 同期非ブロッキング、構造化データを返します
Map<String, List<String>> result = await AliyunHttpdns.resolveHostSyncNonBlocking(
'www.aliyun.com', // ホスト名 (accountId は不要です)
ipType: 'both', // kRequestIpv4AndIpv6 を置き換えます
);
// IP リストを直接取得します
List<String> ipv4s = result['ipv4'] ?? [];
List<String> ipv6s = result['ipv6'] ?? [];
// 最初の IP を使用します
String ip = ipv4s.isNotEmpty ? ipv4s.first : '';カスタム解像度パラメーター:
// スペックアップ前
String result = await _aliyunHttpDns.resolve(
"YOUR_ACCOUNT_ID",
"www.aliyun.com",
kRequestIpv4AndIpv6,
params: {"key": "value"},
cacheKey: "custom_key"
);
// スペックアップ後
Map<String, List<String>> result = await AliyunHttpdns.resolveHostSyncNonBlocking(
'www.aliyun.com',
ipType: 'both',
sdnsParams: {"key": "value"}, // パラメーター名が変更されました
cacheKey: "custom_key"
);4. 事前解決 API の更新
アップグレード前
await _aliyunHttpDns.setPreResolveHosts(
"YOUR_ACCOUNT_ID", // accountId
["www.aliyun.com"],
kRequestIpv4AndIpv6 // requestIpType
);アップグレード後await AliyunHttpdns.setPreResolveHosts( ["www.aliyun.com"], // accountId は不要 ipType: 'both' // kRequestIpv4AndIpv6 の代替 );
await AliyunHttpdns.setPreResolveHosts(
["www.aliyun.com"], // accountId は不要です
ipType: 'both' // kRequestIpv4AndIpv6 を置き換えます
);5. ログ設定の更新
アップグレード前
await _aliyunHttpDns.enableLog(true);アップグレード後await AliyunHttpdns.setLogEnabled(true);
await AliyunHttpdns.setLogEnabled(true);6. SessionId 取得の更新
アップグレード前
String sessionId = await _aliyunHttpDns.getSessionId("YOUR_ACCOUNT_ID");アップグレード後String? sessionId = await AliyunHttpdns.getSessionId();
String? sessionId = await AliyunHttpdns.getSessionId();7. 新機能の使用
キャッシュのクリア
await AliyunHttpdns.cleanAllHostCache();永続キャッシュ設定
await AliyunHttpdns.setPersistentCacheIPEnabled(true);アプリケーションが互換性のない API のいずれも使用していない場合は、何もする必要はありません。
API アップグレードマッピングテーブル
API カテゴリ | アップグレード前 | アップグレード後 |
インスタンスの作成 |
| 不要。静的メソッドを直接使用します。 |
初期化 |
|
|
サービスのビルド | なし |
|
HTTPS リクエストの有効化 |
|
|
期限切れ IP の有効化 |
|
|
ローカルキャッシュの有効化 |
|
|
ネットワーク変更時の事前解決 |
|
|
ログ出力の制御 |
|
|
同期非ブロッキング解決 |
|
|
IPv4 解決 |
|
|
IPv6 解決 |
|
|
IPv4 および IPv6 名前解決 |
|
|
自動選択 | なし |
|
カスタム解決パラメーター |
|
|
事前解決ホストの設定 |
|
|
SessionId の取得 |
|
|
キャッシュのクリア | なし |
|
正しい署名時間 |
| 削除済み |