Android öykünücülerinden ve iOS simülatörlerinden yerel web hizmetlerine Bağlan

Browse sample. Örneğe göz atın

Birçok mobil ve masaüstü uygulaması web hizmetlerini kullanır. Yazılım geliştirme aşamasında, bir web hizmetini yerel olarak dağıtmak ve Android öykünücüsunda veya iOS simülatöründe çalışan bir uygulamadan kullanmak yaygın bir işlemdir. Bu, web hizmetini barındırılan bir uç noktaya dağıtmak zorunda kalmamasını sağlar ve hem uygulama hem de web hizmeti yerel olarak çalıştığından basit bir hata ayıklama deneyimi sağlar.

Windows veya MacCatalyst üzerinde çalışan .NET Çok Platformlu Uygulama Kullanıcı Arabirimi (.NET MAUI) uygulamaları, geliştirme sertifikanıza güvenmiş olmanız koşuluyla HTTP veya HTTPS üzerinden yerel olarak çalışan ASP.NET Core web hizmetlerini ek bir çalışma yapmadan kullanabilir. Ancak, uygulama Android öykünücüsunda veya iOS simülatöründe çalışırken ek çalışma gerekir ve web hizmetinin HTTP veya HTTPS üzerinden çalışıp çalışmadığına bağlı olarak işlem farklıdır.

Yerel makine adresi

Android öykünücüsü ve iOS simülatörü, yerel makinenizde HTTP veya HTTPS üzerinden çalışan web hizmetlerine erişim sağlar. Ancak, her biri için yerel makine adresi farklıdır.

Android

Android öykünücüsünün her örneği geliştirme makinesi ağ arabirimlerinizden yalıtılır ve bir sanal yönlendiricinin arkasında çalışır. Bu nedenle, öykünülmüş bir cihaz geliştirme makinenizi veya ağdaki diğer öykünücü örneklerini göremez.

Ancak, her öykünücünün sanal yönlendiricisi önceden ayrılmış adresleri içeren özel bir ağ alanını yönetir ve adres ana 10.0.2.2 bilgisayar geri döngü arabiriminizin diğer adıdır (geliştirme makinenizde 127.0.0.1). Bu nedenle, göreli URI aracılığıyla /api/todoitems/ get işlemini kullanıma sunan yerel bir web hizmeti verüldüğünde, Android öykünücüsnde çalışan bir uygulama veya https://10.0.2.2:<port>/api/todoitems/öğesine http://10.0.2.2:<port>/api/todoitems/ get isteği göndererek işlemi kullanabilir.

iOS

iOS simülatörü konak makine ağını kullanır. Bu nedenle, simülatörde çalışan uygulamalar, yerel makinenizde çalışan web hizmetlerine makinelerin IP adresi veya ana bilgisayar adı aracılığıyla localhost bağlanabilir. Örneğin, göreli URI aracılığıyla /api/todoitems/ get işlemini kullanıma sunan yerel bir web hizmeti verüldüğünde, iOS simülatöründe çalışan bir uygulama veya https://localhost:<port>/api/todoitems/öğesine http://localhost:<port>/api/todoitems/ bir GET isteği göndererek işlemi kullanabilir.

Not

Windows'tan iOS simülatöründe bir .NET MAUI uygulaması çalıştırırken, uygulama Windows için uzak iOS simülatöründe görüntülenir. Ancak, uygulama eşleştirilmiş Mac üzerinde çalışıyor. Bu nedenle, Mac üzerinde çalışan bir iOS uygulaması için Windows'ta çalışan bir web hizmetine localhost erişimi yoktur.

HTTP üzerinden çalışan yerel web hizmetleri

Android öykünücüsü veya iOS simülatöründe çalışan bir .NET MAUI uygulaması, HTTP üzerinden yerel olarak çalışan bir ASP.NET Core web hizmetini kullanabilir. Bu, .NET MAUI uygulama projenizi ve ASP.NET Core web hizmeti projenizi düz metin HTTP trafiğine izin verecek şekilde yapılandırarak elde edilebilir.

.NET MAUI uygulamanızda yerel web hizmetinizin URL'sini tanımlayan kodda, web hizmeti URL'sinin HTTP düzenini ve doğru ana bilgisayar adını belirttiğinden emin olun. sınıfı, DeviceInfo uygulamanın üzerinde çalıştığı platformu algılamak için kullanılabilir. Ardından doğru konak adı aşağıdaki gibi ayarlanabilir:

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

Sınıfı hakkında DeviceInfo daha fazla bilgi için bkz . Cihaz bilgileri.

Ayrıca, uygulamanızı Android'de çalıştırmak için gerekli ağ güvenlik yapılandırmasını eklemeniz ve uygulamanızı iOS'ta çalıştırmak için Apple Aktarım Güvenliği'ni (ATS) geri çevirmeniz gerekir. Daha fazla bilgi için bkz . Android ağ güvenliği yapılandırması ve iOS ATS yapılandırması.

ayrıca ASP.NET Core web hizmetinizin HTTP trafiğine izin verecek şekilde yapılandırıldığından emin olmanız gerekir. Bu, ASP.NET Core web hizmeti projenizde launch Ayarlar.json bölümüne bir HTTP profili profiles ekleyerek elde edilebilir:

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

Android öykünücüsü veya iOS simülatöründe çalışan bir .NET MAUI uygulaması, web hizmetinin profille birlikte başlatılması koşuluyla http HTTP üzerinden yerel olarak çalışan bir ASP.NET Core web hizmetini kullanabilir.

Android ağ güvenliği yapılandırması

Android'de düz metin yerel trafiğini etkinleştirmek için bir ağ güvenlik yapılandırma dosyası oluşturmanız gerekir. Bu, .NET MAUI uygulama projenizdeki Platforms\Android\Resources\xml klasörüne network_security_config.xml adlı yeni bir XML dosyası ekleyerek elde edilebilir. XML dosyası aşağıdaki yapılandırmayı belirtmelidir:

<?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>

Not

network_security_config.xml dosyasının derleme eyleminin AndroidResource olarak ayarlandığından emin olun.

Ardından, .NET MAUI uygulama projenizdeki Platforms\Android\AndroidManifest.xml dosyasındaki uygulama düğümünde networkSecurityConfig özelliğini yapılandırın:

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

Ağ güvenliği yapılandırma dosyaları hakkında daha fazla bilgi için bkz . developer.android.com'de ağ güvenliği yapılandırması .

iOS ATS yapılandırması

iOS'ta düz metin yerel trafiğini etkinleştirmek için .NET MAUI uygulamanızda Apple Aktarım Güvenliği'ni (ATS) geri çevirmeniz gerekir. Bu, .NET MAUI uygulama projenizdeki Platforms\iOS\Info.plist dosyasına aşağıdaki yapılandırma eklenerek elde edilebilir:

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

ATS hakkında daha fazla bilgi için bkz. developer.apple.com'da Güvenli Olmayan Ağ Bağlan yonlarını Önleme.

HTTPS üzerinden çalışan yerel web hizmetleri

Android öykünücüsü veya iOS simülatöründe çalışan bir .NET MAUI uygulaması, HTTPS üzerinden yerel olarak çalışan bir ASP.NET Core web hizmetini kullanabilir. Bunu etkinleştirme işlemi aşağıdaki gibidir:

  1. Makinenizde otomatik olarak imzalanan geliştirme sertifikasına güvenin. Daha fazla bilgi için bkz . Geliştirme sertifikanıza güvenme.
  2. Yerel makinenizin adresini belirtin. Daha fazla bilgi için bkz . Yerel makine adresini belirtme.
  3. Yerel geliştirme sertifikası güvenlik denetimini atla. Daha fazla bilgi için bkz . Sertifika güvenlik denetimini atlama.

Her öğe sırayla ele alınacaktır.

Geliştirme sertifikanıza güvenme

.NET Core SDK'sını yüklemek, ASP.NET Core HTTPS geliştirme sertifikasını yerel kullanıcı sertifika deponuza yükler. Ancak, sertifika yüklenirken güvenilir değildir. Sertifikaya güvenmek için dotnet dev-certs aracını çalıştırmak için aşağıdaki tek seferlik adımı gerçekleştirin:

dotnet dev-certs https --trust

Aşağıdaki komut araçla ilgili dev-certs yardım sağlar:

dotnet dev-certs https --help

Alternatif olarak, HTTPS kullanan bir ASP.NET Core 2.1 projesi (veya üzeri) çalıştırdığınızda, Visual Studio geliştirme sertifikasının eksik olup olmadığını algılar ve sertifikayı yükleyip güvenmeyi teklif eder.

Not

ASP.NET Core HTTPS geliştirme sertifikası otomatik olarak imzalanır.

Makinenizde yerel HTTPS'yi etkinleştirme hakkında daha fazla bilgi için bkz . Yerel HTTPS'yi etkinleştirme.

Yerel makine adresini belirtin

.NET MAUI uygulamanızdaki yerel web hizmetinizin URL'sini tanımlayan kodda, web hizmeti URL'sinin HTTPS düzenini ve doğru ana bilgisayar adını belirttiğinden emin olun. sınıfı, DeviceInfo uygulamanın üzerinde çalıştığı platformu algılamak için kullanılabilir. Ardından doğru konak adı aşağıdaki gibi ayarlanabilir:

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

Sınıfı hakkında DeviceInfo daha fazla bilgi için bkz . Cihaz bilgileri.

Sertifika güvenlik denetimini atlama

Android öykünücüsunda çalışan bir .NET MAUI uygulamasından yerel güvenli bir web hizmeti çağırmaya çalışmak, sertifika yolu için güven bağlantı noktasının bulunamadığını belirten bir iletiyle birlikte bir java.security.cert.CertPathValidatorException atılmaya neden olur. Benzer şekilde, iOS simülatöründe çalışan bir .NET MAUI uygulamasından yerel güvenli bir web hizmeti çağırmaya çalışmak, sunucu sertifikasının geçersiz olduğunu belirten bir iletiyle hataya neden NSURLErrorDomain olur. Bu hatalar, yerel HTTPS geliştirme sertifikası otomatik olarak imzalandığından ve otomatik olarak imzalanan sertifikalara Android veya iOS tarafından güvenilmediğinden oluşur. Bu nedenle, bir uygulama yerel güvenli bir web hizmeti kullandığında SSL hatalarını yoksaymak gerekir.

Bu, yerel HttpMessageHandler sınıfların yapılandırılmış sürümlerini oluşturucuya HttpClient geçirerek gerçekleştirilebilir ve bu da sınıfın HTTPS üzerinden localhost iletişimine güvenmesini HttpClient bildirir. sınıfı HttpMessageHandler , Android'de uygulaması sınıfı tarafından AndroidMessageHandler sağlanan ve iOS'ta uygulaması sınıfı tarafından NSUrlSessionHandler sağlanan soyut bir sınıftır.

Aşağıdaki örnekte, Android'de sınıfını ve NSUrlSessionHandler iOS'taki sınıfıNı HTTPS üzerinden localhost iletişimine güvenecek şekilde yapılandıran AndroidMessageHandler bir sınıf gösterilmektedir:

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)
    {
        if (url.StartsWith("https://localhost"))
            return true;
        return false;
    }
#endif
}

Android'de GetPlatformMessageHandler yöntemi bir AndroidMessageHandler nesne döndürür. GetPlatformMessageHandler yöntemi, nesnedeki AndroidMessageHandler özelliğini, yerel HTTPS geliştirme sertifikası için sertifika güvenlik denetiminin sonucunu yoksayan bir geri çağırmaya ayarlarServerCertificateCustomValidationCallback.

iOS'ta GetPlatformMessageHandler yöntemi, özelliğini temsilcinin imzası NSUrlSessionHandler.NSUrlSessionHandlerTrustOverrideForUrlCallback ile eşleşen adlı IsHttpsLocalHost bir temsilciye ayarlayan TrustOverrideForUrl bir nesne döndürürNSUrlSessionHandler. Temsilci, IsHttpsLocalHost URL ile https://localhostbaşladığında döndürürtrue.

Sonuçta elde edilen HttpClientHandler nesne, hata ayıklama derlemeleri için oluşturucuya HttpClient bağımsız değişken olarak geçirilebilir:

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

Android öykünücüsü veya iOS simülatöründe çalışan bir .NET MAUI uygulaması daha sonra HTTPS üzerinden yerel olarak çalışan bir ASP.NET Core web hizmetini kullanabilir.