Bagikan melalui


Koneksi ke layanan web lokal dari simulator iOS dan emulator Android

Banyak aplikasi seluler menggunakan layanan web. Selama fase pengembangan, umum untuk menyebarkan layanan web secara lokal dan menggunakannya dari aplikasi seluler yang berjalan di simulator iOS atau emulator Android. Ini menghindari harus menyebarkan layanan web ke titik akhir yang dihosting, dan memungkinkan pengalaman penelusuran kesalahan yang mudah karena aplikasi seluler dan layanan web berjalan secara lokal.

Aplikasi seluler yang berjalan di simulator iOS atau emulator Android dapat menggunakan layanan web ASP.NET Core yang berjalan secara lokal, dan diekspos melalui HTTP, sebagai berikut:

  • Aplikasi yang berjalan di simulator iOS dapat terhubung ke layanan web HTTP lokal melalui alamat IP komputer Anda, atau melalui localhost nama host. Misalnya, mengingat layanan web HTTP lokal yang mengekspos operasi GET melalui /api/todoitems/ URI relatif, aplikasi yang berjalan di simulator iOS dapat menggunakan operasi dengan mengirim permintaan GET ke http://localhost:<port>/api/todoitems/.
  • Aplikasi yang berjalan di emulator Android dapat terhubung ke layanan web HTTP lokal melalui 10.0.2.2 alamat , yang merupakan alias ke antarmuka loopback host Anda (127.0.0.1 di komputer pengembangan Anda). Misalnya, mengingat layanan web HTTP lokal yang mengekspos operasi GET melalui /api/todoitems/ URI relatif, aplikasi yang berjalan di emulator Android dapat menggunakan operasi dengan mengirim permintaan GET ke http://10.0.2.2:<port>/api/todoitems/.

Namun, pekerjaan tambahan diperlukan untuk aplikasi yang berjalan di simulator iOS atau emulator Android untuk menggunakan layanan web lokal yang diekspos melalui HTTPS. Untuk skenario ini, prosesnya adalah sebagai berikut:

  1. Buat sertifikat pengembangan yang ditandatangani sendiri di komputer Anda. Untuk informasi selengkapnya, lihat Membuat sertifikat pengembangan.
  2. Konfigurasikan proyek Anda untuk menggunakan tumpukan jaringan yang sesuai HttpClient untuk build debug Anda. Untuk informasi selengkapnya, lihat Mengonfigurasi proyek Anda.
  3. Tentukan alamat komputer lokal Anda. Untuk informasi selengkapnya, lihat Menentukan alamat komputer lokal.
  4. Melewati pemeriksaan keamanan sertifikat pengembangan lokal. Untuk informasi selengkapnya, lihat Melewati pemeriksaan keamanan sertifikat.

Setiap item akan dibahas secara bergantian.

Membuat sertifikat pengembangan

Menginstal .NET Core SDK menginstal sertifikat pengembangan ASP.NET Core HTTPS ke penyimpanan sertifikat pengguna lokal. Namun, saat sertifikat telah diinstal, sertifikat tersebut tidak tepercaya. Untuk mempercayai sertifikat, lakukan langkah satu kali berikut untuk menjalankan alat dotnet dev-certs :

dotnet dev-certs https --trust

Perintah berikut memberikan bantuan pada dev-certs alat:

dotnet dev-certs https --help

Atau, ketika Anda menjalankan proyek ASP.NET Core 2.1 (atau lebih tinggi), yang menggunakan HTTPS, Visual Studio akan mendeteksi apakah sertifikat pengembangan hilang dan akan menawarkan untuk menginstalnya dan mempercayainya.

Catatan

Sertifikat pengembangan ASP.NET Core HTTPS ditandatangani sendiri.

Untuk informasi selengkapnya tentang mengaktifkan HTTPS lokal di komputer Anda, lihat Mengaktifkan HTTPS lokal.

Konfigurasikan proyek Anda

Aplikasi Xamarin yang berjalan di iOS dan Android dapat menentukan tumpukan jaringan mana yang digunakan oleh HttpClient kelas , dengan pilihan menjadi tumpukan jaringan terkelola, atau tumpukan jaringan asli. Tumpukan terkelola menyediakan tingkat kompatibilitas tinggi dengan kode .NET yang ada, tetapi terbatas pada TLS 1.0 dan dapat lebih lambat dan menghasilkan ukuran yang dapat dieksekusi yang lebih besar. Tumpukan asli bisa lebih cepat dan memberikan keamanan yang lebih baik, tetapi mungkin tidak menyediakan semua fungsionalitas HttpClient kelas.

iOS

Aplikasi Xamarin yang berjalan di iOS dapat menggunakan tumpukan jaringan terkelola, atau tumpukan asli CFNetwork atau NSUrlSession jaringan. Secara default, proyek platform iOS baru menggunakan NSUrlSession tumpukan jaringan, untuk mendukung TLS 1.2, dan menggunakan API asli untuk performa yang lebih baik dan ukuran yang dapat dieksekusi yang lebih kecil. Untuk informasi selengkapnya, lihat Pemilih implementasi HttpClient dan SSL/TLS untuk iOS/macOS.

Android

Aplikasi Xamarin yang berjalan di Android dapat menggunakan tumpukan jaringan terkelola HttpClient , atau tumpukan jaringan asli AndroidClientHandler . Secara default, proyek platform Android baru menggunakan AndroidClientHandler tumpukan jaringan, untuk mendukung TLS 1.2, dan menggunakan API asli untuk performa yang lebih baik dan ukuran yang dapat dieksekusi yang lebih kecil. Untuk informasi selengkapnya tentang tumpukan jaringan Android, lihat Pemilih Implementasi HttpClient Stack dan SSL/TLS untuk Android.

Tentukan alamat komputer lokal

Simulator iOS dan emulator Android menyediakan akses ke layanan web aman yang berjalan di komputer lokal Anda. Namun, alamat komputer lokal berbeda untuk masing-masing.

iOS

Simulator iOS menggunakan jaringan komputer host. Oleh karena itu, aplikasi yang berjalan di simulator dapat terhubung ke layanan web yang berjalan di komputer lokal Anda melalui alamat IP komputer atau melalui localhost nama host. Misalnya, mengingat layanan web aman lokal yang mengekspos operasi GET melalui /api/todoitems/ URI relatif, aplikasi yang berjalan pada simulator iOS dapat menggunakan operasi dengan mengirim permintaan GET ke https://localhost:<port>/api/todoitems/.

Catatan

Saat menjalankan aplikasi seluler di simulator iOS dari Windows, aplikasi ditampilkan di simulator iOS jarak jauh untuk Windows. Namun, aplikasi berjalan di Mac yang dipasangkan. Oleh karena itu, tidak ada akses localhost ke layanan web yang berjalan di Windows untuk aplikasi iOS yang berjalan di Mac.

Android

Setiap instans emulator Android diisolasi dari antarmuka jaringan mesin pengembangan Anda, dan berjalan di belakang router virtual. Oleh karena itu, perangkat yang ditimulasikan tidak dapat melihat mesin pengembangan Anda atau instans emulator lainnya di jaringan.

Namun, router virtual untuk setiap emulator mengelola ruang jaringan khusus yang mencakup alamat yang telah dialokasikan sebelumnya, dengan 10.0.2.2 alamatnya menjadi alias ke antarmuka loopback host Anda (127.0.0.1 pada komputer pengembangan Anda). Oleh karena itu, mengingat layanan web aman lokal yang mengekspos operasi GET melalui /api/todoitems/ URI relatif, aplikasi yang berjalan di emulator Android dapat menggunakan operasi dengan mengirim permintaan GET ke https://10.0.2.2:<port>/api/todoitems/.

Mendeteksi sistem operasi

Kelas DeviceInfo dapat digunakan untuk mendeteksi platform tempat aplikasi berjalan. Nama host yang sesuai, yang memungkinkan akses ke layanan web aman lokal, kemudian dapat diatur sebagai berikut:

public static string BaseAddress =
    DeviceInfo.Platform == DevicePlatform.Android ? "https://10.0.2.2:5001" : "https://localhost:5001";
public static string TodoItemsUrl = $"{BaseAddress}/api/todoitems/";

Untuk informasi selengkapnya tentang DeviceInfo kelas , lihat Xamarin.Essentials: Informasi Perangkat.

Melewati pemeriksaan keamanan sertifikat

Mencoba memanggil layanan web aman lokal dari aplikasi yang berjalan di simulator iOS atau emulator Android akan mengakibatkan HttpRequestException dilemparkan, bahkan saat menggunakan tumpukan jaringan terkelola di setiap platform. Ini karena sertifikat pengembangan HTTPS lokal ditandatangani sendiri, dan sertifikat yang ditandatangani sendiri tidak dipercaya oleh iOS atau Android. Oleh karena itu, perlu untuk mengabaikan kesalahan SSL ketika aplikasi menggunakan layanan web aman lokal. Ini dapat dicapai saat menggunakan tumpukan jaringan terkelola dan asli di iOS dan Android, dengan mengatur ServerCertificateCustomValidationCallback properti pada HttpClientHandler objek ke panggilan balik yang mengabaikan hasil pemeriksaan keamanan sertifikat untuk sertifikat pengembangan HTTPS lokal:

// This method must be in a class in a platform project, even if
// the HttpClient object is constructed in a shared project.
public HttpClientHandler GetInsecureHandler()
{
    HttpClientHandler handler = new HttpClientHandler();
    handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) =>
    {
        if (cert.Issuer.Equals("CN=localhost"))
            return true;
        return errors == System.Net.Security.SslPolicyErrors.None;
    };
    return handler;
}

Dalam contoh kode ini, hasil validasi sertifikat server dikembalikan ketika sertifikat yang menjalani validasi bukan localhost sertifikat. Untuk sertifikat ini, hasil validasi diabaikan dan true dikembalikan, menunjukkan bahwa sertifikat valid. Objek yang HttpClientHandler dihasilkan harus diteruskan sebagai argumen ke HttpClient konstruktor untuk build debug:

#if DEBUG
    HttpClientHandler insecureHandler = GetInsecureHandler();
    HttpClient client = new HttpClient(insecureHandler);
#else
    HttpClient client = new HttpClient();
#endif

Mengaktifkan lalu lintas teks bersih HTTP

Secara opsional, Anda dapat mengonfigurasi proyek iOS dan Android untuk memungkinkan lalu lintas HTTP teks yang jelas. Jika layanan backend dikonfigurasi untuk memungkinkan lalu lintas HTTP, Anda dapat menentukan HTTP di URL dasar lalu mengonfigurasi proyek Anda untuk memungkinkan lalu lintas teks yang jelas:

public static string BaseAddress =
    DeviceInfo.Platform == DevicePlatform.Android ? "http://10.0.2.2:5000" : "http://localhost:5000";
public static string TodoItemsUrl = $"{BaseAddress}/api/todoitems/";

Keikutsertaan iOS ATS

Untuk mengaktifkan lalu lintas lokal teks-jelas di iOS, Anda harus menolak ATS dengan menambahkan yang berikut ini ke file Info.plist Anda:

<key>NSAppTransportSecurity</key>    
<dict>
    <key>NSAllowsLocalNetworking</key>
    <true/>
</dict>

Konfigurasi keamanan jaringan Android

Untuk mengaktifkan lalu lintas lokal teks-jelas di Android, Anda harus membuat konfigurasi keamanan jaringan dengan menambahkan file XML baru bernama network_security_config.xml di folder Sumber Daya/xml . File XML harus menentukan konfigurasi berikut:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
  <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="true">10.0.2.2</domain>
  </domain-config>
</network-security-config>

Kemudian, konfigurasikan properti networkSecurityConfig pada simpul aplikasi di Manifes Android:

<?xml version="1.0" encoding="utf-8"?>
<manifest>
    <application android:networkSecurityConfig="@xml/network_security_config">
        ...
    </application>
</manifest>

Pastikan Tindakan Build ditetapkan sebagai AndroidResource, jika tidak, file XML tidak akan ditemukan pada waktu build.