Koneksi ke layanan web lokal dari emulator Android dan simulator iOS

Browse sample. Telusuri sampel

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

Aplikasi .NET Multi-platform App UI (.NET MAUI) yang berjalan di Windows atau MacCatalyst dapat menggunakan layanan web ASP.NET Core yang berjalan secara lokal melalui HTTP atau HTTPS tanpa pekerjaan tambahan, asalkan Anda telah mempercayai sertifikat pengembangan Anda. Namun, pekerjaan tambahan diperlukan ketika aplikasi berjalan di emulator Android atau simulator iOS, dan prosesnya berbeda tergantung pada apakah layanan web berjalan melalui HTTP atau HTTPS.

Alamat komputer lokal

Emulator Android dan simulator iOS menyediakan akses ke layanan web yang berjalan melalui HTTP atau HTTPS di komputer lokal Anda. Namun, alamat komputer lokal berbeda untuk masing-masing.

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 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/ atau https://10.0.2.2:<port>/api/todoitems/.

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 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/ atau https://localhost:<port>/api/todoitems/.

Catatan

Saat menjalankan aplikasi .NET MAUI 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.

Layanan web lokal yang berjalan melalui HTTP

Aplikasi .NET MAUI yang berjalan di emulator Android atau simulator iOS dapat menggunakan layanan web ASP.NET Core yang berjalan secara lokal melalui HTTP. Ini dapat dicapai dengan mengonfigurasi proyek aplikasi .NET MAUI dan proyek layanan web ASP.NET Core Anda untuk memungkinkan lalu lintas HTTP teks yang jelas.

Dalam kode yang menentukan URL layanan web lokal Anda di aplikasi .NET MAUI Anda, pastikan bahwa URL layanan web menentukan skema HTTP, dan nama host yang benar. Kelas DeviceInfo dapat digunakan untuk mendeteksi platform tempat aplikasi berjalan. Nama host yang benar kemudian dapat diatur sebagai berikut:

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

Untuk informasi selengkapnya tentang kelas, DeviceInfo lihat Informasi perangkat.

Selain itu, untuk menjalankan aplikasi di Android, Anda harus menambahkan konfigurasi keamanan jaringan yang diperlukan, dan untuk menjalankan aplikasi di iOS, Anda harus menolak Apple Transport Security (ATS). Untuk informasi selengkapnya, lihat Konfigurasi keamanan jaringan Android dan konfigurasi ATS iOS.

Anda juga harus memastikan bahwa layanan web ASP.NET Core Anda dikonfigurasi untuk mengizinkan lalu lintas HTTP. Ini dapat dicapai dengan menambahkan profil HTTP ke bagian profiles peluncuran Pengaturan.json di proyek layanan web ASP.NET Core Anda:

{
  ...
  "profiles": {
    "http": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "launchUrl": "api/todoitems",
      "applicationUrl": "http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    ...
  }
}

Aplikasi .NET MAUI yang berjalan di emulator Android atau simulator iOS kemudian dapat menggunakan layanan web ASP.NET Core yang berjalan secara lokal melalui HTTP, asalkan layanan web diluncurkan dengan http profil.

Konfigurasi keamanan jaringan Android

Untuk mengaktifkan lalu lintas lokal teks-jelas di Android, Anda harus membuat file konfigurasi keamanan jaringan. Ini dapat dicapai dengan menambahkan file XML baru bernama network_security_config.xml ke folder Platforms\Android\Resources\xml di proyek aplikasi .NET MAUI Anda. 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>

Catatan

Pastikan bahwa tindakan build file network_security_config.xml diatur ke AndroidResource.

Kemudian, konfigurasikan properti networkSecurityConfig pada simpul aplikasi di file Platforms\Android\AndroidManifest.xml di proyek aplikasi .NET MAUI Anda:

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

Untuk informasi selengkapnya tentang file konfigurasi keamanan jaringan, lihat Konfigurasi keamanan jaringan di developer.android.com.

Konfigurasi ATS iOS

Untuk mengaktifkan lalu lintas lokal teks-jelas di iOS, Anda harus menolak Apple Transport Security (ATS) di aplikasi .NET MAUI Anda. Ini dapat dicapai dengan menambahkan konfigurasi berikut ke file Platforms\iOS\Info.plist di proyek aplikasi .NET MAUI Anda:

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

Untuk informasi selengkapnya tentang ATS, lihat Mencegah Koneksi Jaringan tidak aman pada developer.apple.com.

Layanan web lokal yang berjalan melalui HTTPS

Aplikasi .NET MAUI yang berjalan di emulator Android atau simulator iOS dapat menggunakan layanan web ASP.NET Core yang berjalan secara lokal melalui HTTPS. Proses untuk mengaktifkan ini adalah sebagai berikut:

  1. Percayai sertifikat pengembangan yang ditandatangani sendiri di komputer Anda. Untuk informasi selengkapnya, lihat Mempercayai sertifikat pengembangan Anda.
  2. Tentukan alamat komputer lokal Anda. Untuk informasi selengkapnya, lihat Menentukan alamat komputer lokal.
  3. Melewati pemeriksaan keamanan sertifikat pengembangan lokal. Untuk informasi selengkapnya, lihat Melewati pemeriksaan keamanan sertifikat.

Setiap item akan dibahas secara bergantian.

Percayai sertifikat pengembangan Anda

Menginstal .NET Core SDK menginstal sertifikat pengembangan ASP.NET Core HTTPS ke penyimpanan sertifikat pengguna lokal Anda. 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.

Tentukan alamat komputer lokal

Dalam kode yang menentukan URL layanan web lokal Anda di aplikasi .NET MAUI Anda, pastikan bahwa URL layanan web menentukan skema HTTPS, dan nama host yang benar. Kelas DeviceInfo dapat digunakan untuk mendeteksi platform tempat aplikasi berjalan. Nama host yang benar 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 kelas, DeviceInfo lihat Informasi perangkat.

Melewati pemeriksaan keamanan sertifikat

Mencoba memanggil layanan web aman lokal dari aplikasi .NET MAUI yang berjalan di emulator Android akan mengakibatkan java.security.cert.CertPathValidatorException dilemparkan, dengan pesan yang menunjukkan bahwa jangkar kepercayaan untuk jalur sertifikasi belum ditemukan. Demikian pula, mencoba memanggil layanan web aman lokal dari aplikasi .NET MAUI yang berjalan di simulator iOS akan mengakibatkan NSURLErrorDomain kesalahan dengan pesan yang menunjukkan bahwa sertifikat untuk server tidak valid. Kesalahan ini terjadi karena sertifikat pengembangan HTTPS lokal ditandatangani sendiri, dan sertifikat yang ditandatangani sendiri tidak dipercaya oleh Android atau iOS. Oleh karena itu, perlu untuk mengabaikan kesalahan SSL saat aplikasi menggunakan layanan web aman lokal.

Ini dapat dicapai dengan meneruskan versi kelas asli HttpMessageHandler yang dikonfigurasi ke HttpClient konstruktor, yang menginstruksikan HttpClient kelas untuk mempercayai komunikasi localhost melalui HTTPS. Kelas HttpMessageHandler ini adalah kelas abstrak, yang implementasinya di Android disediakan oleh AndroidMessageHandler kelas , dan yang implementasinya di iOS disediakan oleh NSUrlSessionHandler kelas .

Contoh berikut menunjukkan kelas yang mengonfigurasi AndroidMessageHandler kelas di Android dan NSUrlSessionHandler kelas di iOS untuk mempercayai komunikasi localhost melalui HTTPS:

public class HttpsClientHandlerService
{
    public HttpMessageHandler GetPlatformMessageHandler()
    {
#if ANDROID
        var handler = new Xamarin.Android.Net.AndroidMessageHandler();
        handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) =>
        {
            if (cert != null && cert.Issuer.Equals("CN=localhost"))
                return true;
            return errors == System.Net.Security.SslPolicyErrors.None;
        };
        return handler;
#elif IOS
        var handler = new NSUrlSessionHandler
        {
            TrustOverrideForUrl = IsHttpsLocalhost
        };
        return handler;
#else
     throw new PlatformNotSupportedException("Only Android and iOS supported.");
#endif
    }

#if IOS
    public bool IsHttpsLocalhost(NSUrlSessionHandler sender, string url, Security.SecTrust trust)
    {
        return url.StartsWith("https://localhost");
    }
#endif
}

Di Android, GetPlatformMessageHandler metode mengembalikan AndroidMessageHandler objek. Metode GetPlatformMessageHandler ini mengatur ServerCertificateCustomValidationCallback properti pada AndroidMessageHandler objek ke panggilan balik yang mengabaikan hasil pemeriksaan keamanan sertifikat untuk sertifikat pengembangan HTTPS lokal.

Di iOS, GetPlatformMessageHandler metode mengembalikan NSUrlSessionHandler objek yang mengatur propertinya TrustOverrideForUrl ke delegasi bernama IsHttpsLocalHost yang cocok dengan tanda tangan NSUrlSessionHandler.NSUrlSessionHandlerTrustOverrideForUrlCallback delegasi. Delegasi IsHttpsLocalHost kembali true saat URL dimulai dengan https://localhost.

Objek yang HttpClientHandler dihasilkan kemudian dapat diteruskan sebagai argumen ke HttpClient konstruktor untuk build debug:

#if DEBUG
            HttpsClientHandlerService handler = new HttpsClientHandlerService();
            HttpClient client = new HttpClient(handler.GetPlatformMessageHandler());
#else
            client = new HttpClient();
#endif

Aplikasi .NET MAUI yang berjalan di emulator Android atau simulator iOS kemudian dapat menggunakan layanan web ASP.NET Core yang berjalan secara lokal melalui HTTPS.