全部产品
Search
文档中心

Alibaba Cloud DNS:Panduan pengembangan SDK iOS

更新时间:Nov 10, 2025

Dokumen ini menjelaskan cara mengintegrasikan dan menggunakan SDK iOS HTTPDNS.

Ikhtisar

SDK iOS mengenkapsulasi API JSON DoH untuk HTTPDNS, menyediakan fungsi resolusi nama domain serta caching nama domain yang efisien berdasarkan kebijakan Time-to-Live (TTL) dan Least Recently Used (LRU). Dengan SDK ini, Anda dapat dengan mudah mengintegrasikan HTTPDNS ke dalam aplikasi iOS untuk menangani pengecualian resolusi nama domain serta menerapkan penjadwalan resolusi yang akurat dan berbiaya rendah.

Mulai iOS 14, sistem secara native mendukung dua protokol DNS terenkripsi standar: DNS over TLS (DoT) dan DNS over HTTPS (DoH). Untuk informasi lebih lanjut tentang cara mengatur Mobile Resolution HTTPDNS sebagai resolver DNS terenkripsi default, lihat Solusi DNS terenkripsi native iOS14.

SDK ini memiliki keunggulan berikut:

  • Sederhana dan Mudah Digunakan:

    Anda hanya perlu mengintegrasikan SDK untuk mengakses layanan HTTPDNS. Metode integrasinya sederhana dan menyediakan layanan resolusi yang lebih nyaman.

  • Tanpa Latensi:

    SDK secara internal mengimplementasikan mekanisme caching LRU, menyimpan alamat IP dari setiap resolusi nama domain ke penyimpanan lokal. Ini juga secara aktif memperbarui cache yang kedaluwarsa untuk memastikan cache tetap tepat waktu dan efektif, membantu pengguna mencapai nol latensi untuk resolusi nama domain.

Untuk informasi lebih lanjut tentang cara menggunakan SDK ini, lihat kode sumber proyek contoh alidns_ios_demo.

Integrasi SDK

Impor SDK

Integrasikan menggunakan CocoaPods

  1. Dalam Podfile, tentukan lokasi repositori. Jangan menghilangkan repositori Master.

    source 'https://github.com/CocoaPods/Specs.git'
    source 'https://github.com/aliyun/aliyun-specs.git'
  2. Tambahkan dependensi untuk target proyek.

    pod 'AlicloudPDNS'

Integrasikan secara manual

  1. Untuk informasi lebih lanjut, lihat Unduh SDK untuk mendapatkan SDK iOS.

  2. Setelah mendapatkan pdns-sdk-ios.framework, integrasikan secara manual ke dalam proyek Anda.

  3. Impor pustaka sistem:

    • Foundation.framework

    • SystemConfiguration.framework

    • CoreFoundation.framework

    • CoreTelephony.framework

  4. Tambahkan flag -ObjC di bagian Other Linker Flags dari Build Settings proyek.

Inisialisasi SDK

Anda perlu mendaftarkan aplikasi Anda di konsol terlebih dahulu, mendapatkan pengenal unik dan parameter otentikasi untuk aplikasi tersebut, lalu menginisialisasi SDK setelah integrasi.

Penting

Untuk menggunakan SDK dengan lebih baik dan menghindari situasi di mana alamat IP tidak dapat diselesaikan, harap inisialisasi SDK secepat mungkin.

Inisialisasi SDK di application:didFinishLaunchingWithOptions:.

DNSResolver *resolver = [DNSResolver share];
//setAccountId:@"******": Isi ID Akun yang ditampilkan di halaman "Konfigurasi Akses" di konsol
//andAccessKeyId:@"********": Isi AccessKey ID dari kunci yang Anda buat di "Konfigurasi Akses" konsol
//andAccesskeySecret:@"********": Isi AccessKey Secret dari kunci yang Anda buat di "Konfigurasi Akses" konsol
[resolver setAccountId:@"******" andAccessKeyId:@"********" andAccesskeySecret:@"********"];
//Tentukan domain untuk pembaruan cache kedaluwarsa otomatis, saat ini dibatasi maksimal 10 domain dalam array
[resolver setKeepAliveDomains:@[@"domain pengguna 1",@"domain pengguna 2"]];
//Pramuat domain yang mungkin perlu diselesaikan nanti
[resolver preloadDomains:@[@"domain 1", @"domain 2", @"domain 3"] complete:^{
//Semua domain telah selesai dimuat sebelumnya
}];

Pengenalan API

Pengaturan umum

1. ID Akun dan autentikasi

Parameter wajib. Setelah Anda mendaftarkan aplikasi Anda di konsol, konsol akan menghasilkan pengenal unik Account ID untuk aplikasi ini. Fungsi otentikasi memastikan keamanan identitas pengguna dan mencegah penggunaan pihak ketiga yang tidak sah. Pengguna harus merujuk Buat Kunci untuk membuat AccessKey di konsol, dan atur di aplikasi menggunakan kode berikut:

//setAccountId:@"******": Isi ID Akun yang ditampilkan di halaman "Konfigurasi Akses" di konsol
//andAccessKeyId:@"********": Isi AccessKey ID dari kunci yang Anda buat di "Konfigurasi Akses" konsol
//andAccesskeySecret:@"********": Isi AccessKey Secret dari kunci yang Anda buat di "Konfigurasi Akses" konsol
[[DNSResolver share] setAccountId:@"******" andAccessKeyId:@"********" andAccesskeySecret:@"********"];
Peringatan
  • Untuk menghindari kebocoran parameter seperti Account ID/AccessKey ID/AccessKey Secret dalam log atau data yang dihasilkan selama operasi aplikasi, disarankan untuk menonaktifkan log debug SDK di versi rilis.

  • Kode contoh langsung meneruskan Account ID, AccessKey ID, dan AccessKey Secret dalam properti untuk tujuan demonstrasi. Karena parameter ini erat kaitannya dengan pengukuran dan penagihan, untuk mencegah kebocoran informasi akibat dekompilasi jahat, Anda harus menghindari meneruskan teks biasa secara langsung di lingkungan produksi. Misalnya, Anda dapat mengkodekan atau mengenkripsi teks biasa terlebih dahulu, lalu mendekode atau mendekripsi teks yang dikodekan atau dienkripsi saat meneruskan nilai. Pada saat yang sama, disarankan agar Anda mengaburkan dan memperkuat kode aplikasi Anda. Jika tidak, Account ID, AccessKey ID, dan AccessKey Secret Anda mungkin diperoleh pihak ketiga melalui dekompilasi.

2. Pengaturan protokol resolusi

SDK mendukung pengaturan jenis protokol permintaan resolusi DNS. Anda dapat memilih untuk menyelesaikan melalui protokol HTTP atau HTTPS, yang dapat diatur melalui properti skema.

Secara default, SDK menggunakan dan merekomendasikan protokol HTTPS karena memberikan keamanan yang lebih baik. HTTPDNS ditagih berdasarkan jumlah permintaan resolusi HTTP. Permintaan resolusi HTTPS dikenai biaya lima kali lipat dibandingkan permintaan HTTP. Pilih jenis skema sesuai kebutuhan Anda. Atur properti sebagai berikut:

[DNSResolver share].scheme = DNSResolverSchemeHttps;

3. Atur apakah akan mengaktifkan caching

SDK dapat diatur untuk mengaktifkan fungsi caching. Jika caching diaktifkan, setelah menyelesaikan nama domain untuk pertama kalinya, resolusi berikutnya akan memprioritaskan mendapatkan data dari cache, yang dapat sangat meningkatkan kecepatan resolusi.

SDK mengaktifkan caching secara default. Untuk menonaktifkan caching, Anda perlu mengaturnya menggunakan kode berikut:

[DNSResolver share].cacheEnable=NO;

4. Atur retensi cache nama domain

Ketika caching diaktifkan di SDK, Anda dapat mengatur retensi cache untuk domain tertentu. Jika fitur ini diaktifkan, SDK akan secara otomatis memperbarui cache yang kedaluwarsa untuk domain-domain ini, memastikan bahwa data cache pengguna diperbarui secara tepat waktu. Namun, ini dapat menyebabkan peningkatan jumlah resolusi domain dan konsumsi lalu lintas klien. Jika fitur ini tidak diatur, SDK tidak akan secara otomatis memperbarui cache yang kedaluwarsa, dan hanya akan memperbarui cache saat pengguna memanggil metode resolusi lagi. Untuk mengatur retensi cache untuk domain tertentu, gunakan kode berikut:

//Saat ini dibatasi maksimal 10 domain dalam array
[[DNSResolver share] setKeepAliveDomains:@[@"www.taobao.com",@"www.aliyun.com"]];
Catatan
  • Keuntungan:

    • Dapat memperbarui catatan secara tepat waktu (sebelum TTL habis).

    • Digabungkan dengan pramuatan, dapat mengurangi penundaan resolusi pertama (0ms).

  • Kerugian: Menggunakan TTL *75% sebagai waktu untuk permintaan ulang akan menimbulkan biaya tambahan.

5. Pra-resolusi

Karena SDK dapat diatur untuk mengaktifkan caching, setelah resolusi pertama kali dari nama domain menghasilkan cache, resolusi berikutnya dari nama domain ini dapat mencapai latensi 0. Oleh karena itu, disarankan untuk praresolve domain yang mungkin perlu diselesaikan di aplikasi setelah aplikasi dimulai.

Contoh kode:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
   // Titik override untuk penyesuaian setelah peluncuran aplikasi.
   
   DNSResolver *resolver = [DNSResolver share];
   //setAccountId:@"******": Isi ID Akun yang ditampilkan di halaman "Konfigurasi Akses" di konsol
   //andAccessKeyId:@"********": Isi AccessKey ID dari kunci yang Anda buat di "Konfigurasi Akses" konsol
   //andAccesskeySecret:@"********": Isi AccessKey Secret dari kunci yang Anda buat di "Konfigurasi Akses" konsol
   [resolver setAccountId:@"******" andAccessKeyId:@"********" andAccesskeySecret:@"********"];
   resolver.cacheEnable = YES;
   //Pramuat domain yang mungkin perlu diselesaikan nanti
   [resolver preloadDomains:@[@"domain 1", @"domain 2", @"domain 3"] complete:^{
       //Semua domain telah selesai dimuat sebelumnya
       
   }];
   
   return YES;
}

Pengaturan lanjutan lainnya

1. Atur apakah akan menggunakan alamat IPv6 sisi server

Layanan HTTPDNS mendukung akses dual-stack IPv4 dan IPv6. Secara default, SDK menggunakan alamat IPv4 untuk mengakses server DNS.

Untuk menggunakan alamat IPv6 (jaringan saat ini harus mendukung IPv6), atur dengan kode berikut:

[DNSResolver share].ipv6Enable = YES;

2. Mode singkat

API JSON DoH HTTPDNS mengembalikan data dalam format JSON lengkap atau array alamat IP singkat. Secara default, SDK menggunakan format JSON lengkap.

Untuk mengaturnya ke format array IP singkat, Anda perlu menggunakan kode berikut:

[DNSResolver share].shortEnable = YES;

3. Atur ukuran cache

Jika SDK telah mengaktifkan caching, Anda dapat menyesuaikan jumlah cache (rentang yang didukung antara 100 dan 500).

Jumlah cache default dari SDK adalah 100 nama domain. Untuk menyesuaikan jumlah cache, Anda dapat mengaturnya melalui properti cacheCountLimit:

[DNSResolver share].cacheCountLimit = 200;

4. Atur apakah akan mengaktifkan probing alamat IP

SDK dapat diatur untuk mengaktifkan pengujian kecepatan IP. Jika pengujian kecepatan IP diaktifkan, hasil resolusi akan memprioritaskan mengembalikan alamat IP tercepat, dan array akan diurutkan dari yang tercepat ke yang terlambat berdasarkan hasil pengujian kecepatan.

SDK tidak mengaktifkan pengujian kecepatan IP secara default. Untuk mengaktifkan pengujian kecepatan IP, Anda perlu mengaturnya menggunakan kode berikut:

[DNSResolver share].speedTestEnable=YES;

5. Atur metode probing alamat IP

SDK dapat mengatur metode untuk pengujian kecepatan IP. Jika pengujian kecepatan IP diaktifkan dan parameter ini diatur ke 0, deteksi ICMP akan digunakan. Jika parameter ini diatur ke 80, 443, atau nomor port lain yang didukung, deteksi port socket spesifik akan digunakan.

Nilai default untuk parameter ini adalah 0. Untuk mengatur deteksi port socket spesifik, Anda perlu menggunakan kode berikut:

[DNSResolver share].speedPort = 80;

6. Mengonfigurasi caching nama domain berdasarkan ISP

SDK dapat diatur untuk mengaktifkan diferensiasi cache domain berbasis jaringan ISP. Jika diaktifkan, data cache domain akan disimpan secara terpisah di lingkungan jaringan yang berbeda tanpa saling mempengaruhi. Jika tidak diaktifkan, data cache domain yang sama akan digunakan di berbagai jaringan.

SDK tidak mengaktifkan diferensiasi cache domain berbasis jaringan ISP secara default. Untuk mengaktifkan fitur ini, Anda perlu mengaturnya menggunakan kode berikut:

[DNSResolver share].ispEnable = YES;

7. Menetapkan TTL maksimum untuk cache negatif

SDK dapat mengatur waktu TTL maksimum untuk cache negatif (cache tidak valid di mana nama domain tidak memiliki alamat IP yang dikonfigurasikan, mengakibatkan tidak ada IP yang dikembalikan dalam hasil resolusi). Jika waktu ini diatur, itu akan membatasi TTL maksimum cache negatif agar tidak melebihi waktu yang ditetapkan.

Nilai default untuk parameter ini adalah 30 detik. Untuk mengatur waktu TTL maksimum untuk cache negatif, Anda perlu menggunakan kode berikut:

[DNSResolver share].maxNegativeCache = 30;

8. Menetapkan TTL maksimum untuk cache

SDK dapat mengatur waktu TTL maksimum untuk cache. Jika waktu ini diatur, itu akan membatasi TTL maksimum cache agar tidak melebihi waktu yang ditetapkan.

Nilai default untuk parameter ini adalah 3600 detik. Untuk mengatur waktu TTL maksimum untuk cache, Anda perlu menggunakan kode berikut:

[DNSResolver share].maxCacheTTL= 3600;

9. Menetapkan apakah akan mengaktifkan cache immutable

[DNSResolver share].immutableCacheEnable = NO;// Cache immutable dinonaktifkan secara default
Penting

SDK secara internal memiliki tiga mekanisme pembaruan cache:

  • Cache immutable: Setelah fitur ini diaktifkan, cache akan selalu dianggap valid selama runtime aplikasi, dan pemeriksaan kedaluwarsa cache serta pembaruannya tidak akan dilakukan lagi. Ini dapat meminimalkan jumlah resolusi pengguna semaksimal mungkin.

    Metode pengaturan: [DNSResolver share].immutableCacheEnable = YES

  • Pembaruan cache aktif: Pembaruan aktif memastikan bahwa permintaan resolusi mengenai catatan resolusi terbaru di cache. Ketika resolusi otoritatif dari nama domain berubah, mekanisme ini memastikan bahwa permintaan resolusi mengenai cache, sehingga mengurangi latensi DNS, sambil juga memastikan bahwa catatan resolusi yang disimpan di cache biasanya merupakan nilai catatan terbaru. Saat ini dibatasi maksimal 10 domain dalam array.

    Metode pengaturan: [[DNSResolver share] setKeepAliveDomains:@[@"domain pengguna 1",@"domain pengguna 2"]]

  • Pembaruan cache pasif: Saat memanggil dua metode berikut untuk mendapatkan hasil resolusi, cache akan diperbarui secara pasif:

    • - (void)getIpv4DataWithDomain:(NSString *)domain complete:(void(^)(NSArray<NSString *> *dataArray))complete metode: Mendapatkan array alamat IPv4 setelah resolusi nama domain. Jika cache tidak kosong dan dalam periode validitas TTL, itu akan langsung mengembalikan hasil cache. Jika tidak, itu akan terlebih dahulu mendapatkan hasil resolusi terbaru melalui permintaan jaringan, lalu mengembalikan hasil itu dan memperbarui cache. Metode ini sering digunakan dalam skenario dengan persyaratan akurasi tinggi untuk hasil resolusi.

    • - (NSArray<NSString *> *)getIpv4ByCacheWithDomain:(NSString *)domain andExpiredIPEnabled:(BOOL)enable metode: Mendapatkan hasil resolusi IPv4 dari cache. Metode ini akan memutuskan apakah akan mengembalikan hasil resolusi kedaluwarsa dari cache berdasarkan nilai parameter enable.

      Deskripsi parameter: Jika enable adalah YES, itu akan mengembalikan catatan lama meskipun cache telah kedaluwarsa (mengembalikan nil jika cache kosong), dan memperbarui cache melalui permintaan asinkron. Jika itu adalah NO, itu akan mengembalikan nil ketika cache telah kedaluwarsa atau kosong, dan memperbarui cache melalui permintaan asinkron.

10. Timeout

Properti timeout adalah batas waktu untuk resolusi nama domain. Batas waktu default adalah 3 detik. Pengguna dapat menyesuaikan batas waktu, dan disarankan untuk mengaturnya antara 2 hingga 5 detik.

API Layanan

Contoh kode:

/// Preresolves informasi domain, dapat dipanggil saat program dimulai, hasil resolusi akan disimpan di cache untuk mempercepat resolusi nama domain berikutnya
/// Secara otomatis mendeteksi lingkungan jaringan (hanya-ipv4, hanya-ipv6, ipv4 dan ipv6 dual-stack) untuk menyelesaikan IP yang sesuai dengan lingkungan jaringan saat ini
/// @param domainArray  Array domain
/// @param complete     Panggil balik setelah resolusi selesai
- (void)preloadDomains:(NSArray<NSString *> *)domainArray complete:(void(^)(void))complete;

/// Mendapatkan array IP setelah resolusi nama domain, secara otomatis mendeteksi lingkungan jaringan (hanya-ipv4, hanya-ipv6, ipv4 dan ipv6 dual-stack) untuk mendapatkan IP yang sesuai dengan lingkungan jaringan saat ini,
/// Jika caching diaktifkan, itu akan memprioritaskan mengembalikan data dari cache. Jika tidak ada cache atau cache telah kedaluwarsa, itu akan mendapatkan IP yang sesuai melalui permintaan jaringan. Jika caching tidak diaktifkan, itu akan langsung mendapatkan IP yang sesuai melalui permintaan jaringan.
/// @param domain           Nama domain
/// @param complete       Panggil balik (semua alamat IP)
- (void)getIpsDataWithDomain:(NSString *)domain complete:(void(^)(NSArray<NSString *> *dataArray))complete;

/// Secara otomatis mendeteksi lingkungan jaringan (hanya-ipv4, hanya-ipv6, ipv4 dan ipv6 dual-stack) untuk langsung mendapatkan array IP yang sesuai dengan lingkungan jaringan saat ini dari cache, tanpa menunggu.  
/// Jika tidak ada cache, mengembalikan nil; jika ada cache dan enable diatur ke YES, itu akan mengembalikan data cache ke pengguna, dan jika data cache telah kedaluwarsa, itu akan secara asinkron menyelesaikan nama domain untuk memperbarui data cache; jika ada cache dan enable diatur ke NO, itu akan mengembalikan nil ke pengguna ketika cache telah kedaluwarsa dan secara asinkron menyelesaikan nama domain untuk memperbarui data cache.
/// @param domain   Nama domain
/// @param enable   Apakah memungkinkan mengembalikan IP yang kedaluwarsa
- (NSArray<NSString *> *)getIpsByCacheWithDomain:(NSString *)domain andExpiredIPEnabled:(BOOL)enable;

/// Mendapatkan array informasi IPv4 setelah resolusi nama domain
/// Jika caching diaktifkan, itu akan memprioritaskan mengembalikan data dari cache. Jika tidak ada cache atau cache telah kedaluwarsa, itu akan mendapatkan IP yang sesuai melalui permintaan jaringan. Jika caching tidak diaktifkan, itu akan langsung mendapatkan IP yang sesuai melalui permintaan jaringan.
/// @param domain           Nama domain
/// @param complete       Panggil balik (semua informasi domain)
- (void)getIpv4InfoWithDomain:(NSString *)domain complete:(void(^)(NSArray<DNSDomainInfo *> *domainInfoArray))complete;

/// Mendapatkan array informasi IPv6 setelah resolusi nama domain
/// Jika caching diaktifkan, itu akan memprioritaskan mengembalikan data dari cache. Jika tidak ada cache atau cache telah kedaluwarsa, itu akan mendapatkan IP yang sesuai melalui permintaan jaringan. Jika caching tidak diaktifkan, itu akan langsung mendapatkan IP yang sesuai melalui permintaan jaringan.
/// @param domain           Nama domain
/// @param complete       Panggil balik (semua informasi domain)
- (void)getIpv6InfoWithDomain:(NSString *)domain complete:(void(^)(NSArray<DNSDomainInfo *> *domainInfoArray))complete;

/// Mendapatkan informasi IPv4 setelah resolusi nama domain
/// Jika caching diaktifkan, itu akan memprioritaskan mengembalikan data dari cache. Jika tidak ada cache atau cache telah kedaluwarsa, itu akan mendapatkan IP yang sesuai melalui permintaan jaringan. Jika caching tidak diaktifkan, itu akan langsung mendapatkan IP yang sesuai melalui permintaan jaringan.
/// @param domain           Nama domain
/// @param complete       Panggil balik (salah satu acak dari semua informasi domain)
- (void)getRandomIpv4InfoWithDomain:(NSString *)domain complete:(void(^)(DNSDomainInfo *domainInfo))complete;

/// Mendapatkan informasi IPv6 setelah resolusi nama domain
/// Jika caching diaktifkan, itu akan memprioritaskan mengembalikan data dari cache. Jika tidak ada cache atau cache telah kedaluwarsa, itu akan mendapatkan IP yang sesuai melalui permintaan jaringan. Jika caching tidak diaktifkan, itu akan langsung mendapatkan IP yang sesuai melalui permintaan jaringan.
/// @param domain           Nama domain
/// @param complete       Panggil balik (salah satu acak dari semua informasi domain)
- (void)getRandomIpv6InfoWithDomain:(NSString *)domain complete:(void(^)(DNSDomainInfo *domainInfo))complete;

/// Mendapatkan array alamat IPv4 setelah resolusi nama domain
/// Jika caching diaktifkan, itu akan memprioritaskan mengembalikan data dari cache. Jika tidak ada cache atau cache telah kedaluwarsa, itu akan mendapatkan IP yang sesuai melalui permintaan jaringan. Jika caching tidak diaktifkan, itu akan langsung mendapatkan IP yang sesuai melalui permintaan jaringan.
/// @param domain           Nama domain
/// @param complete       Panggil balik (semua alamat IP)
- (void)getIpv4DataWithDomain:(NSString *)domain complete:(void(^)(NSArray<NSString *> *dataArray))complete;

/// Mendapatkan array alamat IPv6 setelah resolusi nama domain
/// Jika caching diaktifkan, itu akan memprioritaskan mengembalikan data dari cache. Jika tidak ada cache atau cache telah kedaluwarsa, itu akan mendapatkan IP yang sesuai melalui permintaan jaringan. Jika caching tidak diaktifkan, itu akan langsung mendapatkan IP yang sesuai melalui permintaan jaringan.
/// @param domain           Nama domain
/// @param complete       Panggil balik (semua alamat IP)
- (void)getIpv6DataWithDomain:(NSString *)domain complete:(void(^)(NSArray<NSString *> *dataArray))complete;

/// Mendapatkan alamat IPv4 setelah resolusi nama domain
/// Jika caching diaktifkan, itu akan memprioritaskan mengembalikan data dari cache. Jika tidak ada cache atau cache telah kedaluwarsa, itu akan mendapatkan IP yang sesuai melalui permalui permintaan jaringan. Jika caching tidak diaktifkan, itu akan langsung mendapatkan IP yang sesuai melalui permintaan jaringan.  
/// @param domain            Nama domain  
/// @param complete        Panggil balik (salah satu acak dari semua alamat IP)  
- (void)getRandomIpv4DataWithDomain:(NSString *)domain complete:(void(^)(NSString *data))complete;  

/// Mendapatkan alamat IPv6 setelah resolusi nama domain  
/// Jika caching diaktifkan, itu akan memprioritaskan mengembalikan data dari cache. Jika tidak ada cache atau cache telah kedaluwarsa, itu akan mendapatkan IP yang sesuai melalui permintaan jaringan. Jika caching tidak diaktifkan, itu akan langsung mendapatkan IP yang sesuai melalui permintaan jaringan.  
/// @param domain            Nama domain  
/// @param complete        Panggil balik (salah satu acak dari semua alamat IP)  
- (void)getRandomIpv6DataWithDomain:(NSString *)domain complete:(void(^)(NSString *data))complete;  

/// Praresolves informasi IPv4 domain, dapat dipanggil saat program dimulai, menyimpan hasil resolusi di cache untuk mempercepat resolusi nama domain berikutnya  
/// @param domainArray  Array domain  
/// @param complete         Panggil balik setelah resolusi selesai  
- (void)preloadIpv4Domains:(NSArray<NSString *> *)domainArray complete:(void(^)(void))complete;  

/// Praresolves informasi IPv6 domain, dapat dipanggil saat program dimulai, menyimpan hasil resolusi di cache untuk mempercepat resolusi nama domain berikutnya  
/// @param domainArray  Array domain  
/// @param complete         Panggil balik setelah resolusi selesai  
- (void)preloadIpv6Domains:(NSArray<NSString *> *)domainArray complete:(void(^)(void))complete;  

/// Secara langsung mendapatkan hasil resolusi IPv4 dari cache, tanpa menunggu.  
/// Jika tidak ada cache, mengembalikan nil; jika ada cache dan enable diatur ke YES, itu akan mengembalikan data cache ke pengguna, dan jika data cache telah kedaluwarsa, itu akan secara asinkron menyelesaikan nama domain untuk memperbarui data cache; jika ada cache dan enable diatur ke NO, itu akan mengembalikan nil ke pengguna ketika cache telah kedaluwarsa dan secara asinkron menyelesaikan nama domain untuk memperbarui data cache.  
/// @param domain   Nama domain  
/// @param enable   Apakah memungkinkan mengembalikan IP yang kedaluwarsa  
- (NSArray<NSString *> *)getIpv4ByCacheWithDomain:(NSString *)domain andExpiredIPEnabled:(BOOL)enable;  

/// Secara langsung mendapatkan hasil resolusi IPv6 dari cache, tanpa menunggu.  
/// Jika tidak ada cache, mengembalikan nil; jika ada cache dan enable diatur ke YES, itu akan mengembalikan data cache ke pengguna, dan jika data cache telah kedaluwarsa, itu akan secara asinkron menyelesaikan nama domain untuk memperbarui data cache; jika ada cache dan enable diatur ke NO, itu akan mengembalikan nil ke pengguna ketika cache telah kedaluwarsa dan secara asinkron menyelesaikan nama domain untuk memperbarui data cache.  
/// @param domain   Nama domain  
/// @param enable   Apakah memungkinkan mengembalikan IP yang kedaluwarsa  
- (NSArray<NSString *> *)getIpv6ByCacheWithDomain:(NSString *)domain andExpiredIPEnabled:(BOOL)enable;  

/// Pengumpulan informasi statistik  
-(NSArray *)getRequestReportInfo;  

Contoh penggunaan API

1. Konfigurasi informasi dasar

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
   // Titik override untuk penyesuaian setelah peluncuran aplikasi.  
   // Metode inisialisasi unik  
   DNSResolver *resolver = [DNSResolver share];  
   //setAccountId:@"******": Isi ID Akun yang ditampilkan di halaman "Konfigurasi Akses" di konsol  
   //andAccessKeyId:@"********": Isi AccessKey ID dari kunci yang Anda buat di "Konfigurasi Akses" konsol  
   //andAccesskeySecret:@"********": Isi AccessKey Secret dari kunci yang Anda buat di "Konfigurasi Akses" konsol  
   [resolver setAccountId:@"******" andAccessKeyId:@"********" andAccesskeySecret:@"********"];  
   // Tentukan domain untuk pembaruan cache otomatis yang kedaluwarsa, saat ini dibatasi maksimal 10 domain dalam array  
	 [resolver setKeepAliveDomains:@[@"domain pengguna 1",@"domain pengguna 2"]];  
   // Pramuat domain yang mungkin perlu diselesaikan nanti, dapat memperoleh hasil resolusi terlebih dahulu dan menyimpannya di cache  
   [resolver preloadDomains:@[@"domain 1", @"domain 2", @"domain 3"] complete:^{  
       // Semua domain telah selesai dimuat sebelumnya  
       
   }];  
   return YES;  
}

2. Antarmuka Resolusi Nama Domain

SDK menyediakan beberapa metode resolusi domain bagi pengguna untuk dipilih dan digunakan, yang dapat dilihat di file header DNSResolver.h. Di bawah ini adalah contoh salah satu metode resolusi yang secara otomatis membedakan lingkungan jaringan (IPv4-only, IPv6-only, IPv4 dan IPv6 dual-stack).

Deklarasi antarmuka:

/// Mendapatkan array IP setelah resolusi nama domain, secara otomatis membedakan lingkungan jaringan (ipv4-only, ipv6-only, ipv4 dan ipv6 dual-stack) untuk mendapatkan IP yang sesuai dengan lingkungan jaringan saat ini  
/// Jika caching diaktifkan, itu akan memprioritaskan mengembalikan data dari cache. Jika tidak ada cache atau cache telah kedaluwarsa, itu akan mendapatkan IP yang sesuai melalui permintaan jaringan. Jika caching tidak diaktifkan, itu akan langsung mendapatkan IP yang sesuai melalui permintaan jaringan.  
/// @param domain           Nama domain  
/// @param complete       Panggil balik (semua alamat IP)  
- (void)getIpsDataWithDomain:(NSString *)domain complete:(void(^)(NSArray<NSString *> *dataArray))complete;

Contoh panggilan antarmuka:

[[DNSResolver share] getIpsDataWithDomain:@"www.taobao.com" complete:^(NSArray<NSString *> *dataArray) {  
    // dataArray adalah array alamat IP yang sesuai dengan nama domain www.taobao.com  
   if (dataArray.count > 0) {  
       //TODO: Gunakan alamat IP untuk koneksi URL  
   }    
}];

3. Mengambil hasil resolusi langsung dari cache

Deklarasi antarmuka:

/// Secara otomatis membedakan lingkungan jaringan (ipv4-only, ipv6-only, ipv4 dan ipv6 dual-stack) untuk langsung mendapatkan array IP yang sesuai dengan lingkungan jaringan saat ini dari cache, tanpa menunggu.  
/// Jika tidak ada cache, mengembalikan nil; jika ada cache dan enable diatur ke YES, itu akan mengembalikan data cache ke pengguna, dan jika data cache telah kedaluwarsa, itu akan secara asinkron menyelesaikan nama domain untuk memperbarui data cache; jika ada cache dan enable diatur ke NO, itu akan mengembalikan nil ke pengguna ketika cache telah kedaluwarsa dan secara asinkron menyelesaikan nama domain untuk memperbarui data cache.  
/// @param domain   Nama domain  
/// @param enable   Apakah memungkinkan mengembalikan IP yang kedaluwarsa  
- (NSArray<NSString *> *)getIpsByCacheWithDomain:(NSString *)domain andExpiredIPEnabled:(BOOL)enable;

Contoh panggilan:

NSArray *result = [[DNSResolver share] getIpsByCacheWithDomain:@"nama domain" andExpiredIPEnabled:YES];  
// Dapatkan hasil cache  
if (result.count > 0) {  
   //TODO: Gunakan alamat IP untuk koneksi URL  
   
}

Catatan: Mendapatkan hasil cache langsung dari cache lebih cepat, tetapi hasilnya akan menjadi nil jika tidak ada cache, atau jika ada cache tetapi hasil resolusi cache telah kedaluwarsa dan enable adalah NO.

4. Hapus Cache

Deklarasi antarmuka:

///hostArray adalah array nama domain host yang perlu dihapus. Untuk menghapus semua data, berikan nil atau array kosong
-(void)clearHostCache:(NSArray <NSString *>*)hostArray;

Contoh panggilan:

[[DNSResolver share] clearHostCache:@[@"domain 1", @"domain 2"]];

5. Kumpulkan statistik

Deklarasi antarmuka:

/// Pengumpulan informasi statistik  
-(NSArray *)getRequestReportInfo;

Contoh panggilan:

NSArray *array = [[DNSResolver share] getRequestReportInfo];

Format data:

 (  
      {  
         avgRtt = "1";                                // Waktu rata-rata resolusi domain dalam ms  
         cacheDnsNum = 0;                             // Jumlah hit cache                       
         domain = "www.taobao.com";                   // Nama domain yang sedang diselesaikan  
         gobackLocaldnsNum = 0;                       // Jumlah kali downgrade ke LocalDNS  
         localErro = 0;                               // Jumlah kegagalan resolusi LocalDNS  
         maxRtt = "60";                               // Waktu maksimum resolusi domain dalam ms  
         noPermissionErro = 0;                        // Jumlah kegagalan autentikasi pengguna  
         noResponseErro = 0;                          // Jumlah timeout permintaan tanpa respons          
         requestPDnsNum = 1;                          // Jumlah kueri rekursif  
         sp = "China Mobile";                         // Nama ISP  
         successNum = 1;                              // Jumlah resolusi berhasil  
         timeoutErro = 0;                             // Jumlah kesalahan timeout jaringan  
         type = 28;                                   // Jenis IP, 1 merepresentasikan IPv4, 28 merepresentasikan IPv6  
         urlParameterErro = 0;                        // Jumlah kesalahan format parameter permintaan  
         urlPathErro = 0;                             // Jumlah kesalahan URL  
      }  
         ......  
 );

Catatan

  1. pdns-sdk-ios.framework mendukung versi minimum iOS 9.0.

  2. Saat menggunakan protokol HTTP untuk permintaan, Anda perlu mengatur App Transport Security Settings->Allow Arbitrary Loads ke YES di Info.plist.

  3. Setelah memperoleh alamat IP suatu nama domain melalui HTTPDNS, klien dapat menggunakan alamat IP tersebut untuk mengirim permintaan layanan. Bidang Host di Header permintaan HTTP harus diatur ke nama domain asli.

    Contohnya:

    //ip adalah alamat IP yang diselesaikan dari nama domain asli  
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"https://%@", ip]];  
    NSMutableURLRequest *mutableReq = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval: 10];  
    // Atur host  
    [mutableReq setValue:@"nama domain asli" forHTTPHeaderField:@"host"];
  4. Untuk memastikan operasi bisnis normal, ketika tidak ada IP yang diperoleh untuk nama domain melalui SDK, pengembang perlu menggunakan alamat nama domain asli untuk permintaan sebagai fallback. Contoh kode adalah sebagai berikut:

    NSArray *array = [[DNSResolver share] getIpsByCacheWithDomain:@"nama domain asli" andExpiredIPEnabled:YES];  
    NSString *ip = array.firstObject;  
    if (ip.length > 0) {  
        // Ganti host di URL dengan IP untuk permintaan antarmuka  
         
    }else{  
        // Tambahkan penanganan fallback (gunakan URL asli untuk permintaan antarmuka)  
    }
  5. Jika terdapat proxy HTTP perantara, baris permintaan dalam permintaan klien menggunakan URL jalur mutlak. Jika Anda mengaktifkan HTTPDNS dan menggunakan URL berbasis IP, proxy perantara akan mengidentifikasi informasi IP Anda dan meneruskannya sebagai host asli ke server target. Dalam kasus ini, server target tidak dapat memproses permintaan HTTP yang tidak berisi informasi host asli. Disarankan untuk memeriksa apakah proxy jaringan diaktifkan pada perangkat. Jika ya, jangan gunakan HTTPDNS untuk resolusi nama domain.

FAQ

FAQ terkait SDK/API