Aracılığıyla paylaş


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

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

iOS simülatöründe veya Android öykünücüsunda çalışan mobil uygulamalar, yerel olarak çalışan ve HTTP üzerinden kullanıma sunulan ASP.NET Core web hizmetlerini aşağıdaki gibi kullanabilir:

  • iOS simülatöründe çalışan uygulamalar, makinelerinizin IP adresi veya ana bilgisayar adı aracılığıyla localhost yerel HTTP web hizmetlerine bağlanabilir. Örneğin, göreli URI aracılığıyla /api/todoitems/ get işlemini kullanıma sunan yerel bir HTTP web hizmeti verüldüğünde, iOS simülatöründe çalışan bir uygulama bir http://localhost:<port>/api/todoitems/GET isteği göndererek işlemi kullanabilir.
  • Android öykünücüsunda çalışan uygulamalar, ana bilgisayar geri döngü arabiriminizin (127.0.0.1geliştirme makinenizde) diğer adı olan adres aracılığıyla 10.0.2.2 yerel HTTP web hizmetlerine bağlanabilir. Örneğin, göreli URI aracılığıyla /api/todoitems/ bir GET işlemini kullanıma sunan yerel bir HTTP web hizmeti verüldüğünde, Android öykünücüsunda çalışan bir uygulama öğesine http://10.0.2.2:<port>/api/todoitems/get isteği göndererek işlemi kullanabilir.

Ancak, iOS simülatöründe veya Android öykünücüsunda çalışan bir uygulamanın HTTPS üzerinden kullanıma sunulan yerel bir web hizmetini tüketmesi için ek çalışma gereklidir. Bu senaryo için işlem aşağıdaki gibidir:

  1. Makinenizde otomatik olarak imzalanan bir geliştirme sertifikası oluşturun. Daha fazla bilgi için bkz . Geliştirme sertifikası oluşturma.
  2. Projenizi hata ayıklama derlemeniz için uygun HttpClient ağ yığınını kullanacak şekilde yapılandırın. Daha fazla bilgi için bkz . Projenizi yapılandırma.
  3. Yerel makinenizin adresini belirtin. Daha fazla bilgi için bkz . Yerel makine adresini belirtme.
  4. 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 sertifikası oluşturma

.NET Core SDK'sını yüklemek, ASP.NET Core HTTPS geliştirme sertifikasını yerel kullanıcı sertifika deposuna 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.

Projenizi yapılandırma

iOS ve Android üzerinde çalışan Xamarin uygulamaları, hangi ağ yığınının HttpClient sınıf tarafından kullanıldığını belirtebilir ve seçenekler yönetilen ağ yığını veya yerel ağ yığınları olabilir. Yönetilen yığın, mevcut .NET koduyla yüksek düzeyde uyumluluk sağlar, ancak TLS 1.0 ile sınırlıdır ve daha yavaş olabilir ve daha büyük bir yürütülebilir boyuta neden olabilir. Yerel yığınlar daha hızlı olabilir ve daha iyi güvenlik sağlayabilir, ancak sınıfın tüm işlevlerini HttpClient sağlamayabilir.

iOS

iOS üzerinde çalışan Xamarin uygulamaları yönetilen ağ yığınını veya yerel CFNetwork veya NSUrlSession ağ yığınlarını kullanabilir. Varsayılan olarak, yeni iOS platform projeleri NSUrlSession TLS 1.2'yi desteklemek için ağ yığınını kullanır ve daha iyi performans ve daha küçük yürütülebilir boyut için yerel API'ler kullanır. Daha fazla bilgi için bkz . iOS/macOS için HttpClient ve SSL/TLS uygulama seçicisi.

Android

Android üzerinde çalışan Xamarin uygulamaları yönetilen HttpClient ağ yığınını veya yerel AndroidClientHandler ağ yığınını kullanabilir. Varsayılan olarak, yeni Android platformu projeleri AndroidClientHandler TLS 1.2'yi desteklemek için ağ yığınını kullanır ve daha iyi performans ve daha küçük yürütülebilir boyut için yerel API'leri kullanır. Android ağ yığınları hakkında daha fazla bilgi için bkz . Android için HttpClient Stack ve SSL/TLS Uygulama seçicisi.

Yerel makine adresini belirtin

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

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/ bir GET işlemini kullanıma sunan yerel bir güvenli web hizmeti göz önünde bulundurulduğunda, iOS simülatöründe çalışan bir uygulama bir https://localhost:<port>/api/todoitems/GET isteği göndererek işlemi kullanabilir.

Not

Windows'tan iOS simülatöründe bir mobil uygulama çalıştırıldığında, 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.

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/ bir GET işlemini kullanıma sunan yerel bir güvenli web hizmeti verüldüğünde, Android öykünücüsnde çalışan bir uygulama bir https://10.0.2.2:<port>/api/todoitems/GET isteği göndererek işlemi kullanabilir.

İşletim sistemini algılama

sınıfı, DeviceInfo uygulamanın üzerinde çalıştığı platformu algılamak için kullanılabilir. Yerel güvenli web hizmetlerine erişim sağlayan uygun ana bilgisayar 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 . Xamarin.Essentials: Cihaz Bilgileri.

Sertifika güvenlik denetimini atlama

iOS simülatöründe veya Android öykünücüsunda çalışan bir uygulamadan yerel güvenli bir web hizmeti çağırmaya çalışmak, her platformda yönetilen ağ yığını kullanılırken bile bir HttpRequestException atılmaya neden olur. Bunun nedeni yerel HTTPS geliştirme sertifikasının otomatik olarak imzalı olması ve otomatik olarak imzalanan sertifikalara iOS veya Android tarafından güvenilmemelerinden kaynaklanır. Bu nedenle, bir uygulama yerel güvenli bir web hizmeti kullandığında SSL hatalarını yoksaymak gerekir. Bu, iOS ve Android'de hem yönetilen hem de yerel ağ yığınları kullanılırken, nesnedeki HttpClientHandler özelliği yerel HTTPS geliştirme sertifikası için sertifika güvenlik denetiminin sonucunu yoksayan bir geri çağırmaya ayarlayarak ServerCertificateCustomValidationCallback gerçekleştirilebilir:

// 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;
}

Bu kod örneğinde, doğrulama yapılan sertifika sertifika olmadığında localhost sunucu sertifikası doğrulama sonucu döndürülür. Bu sertifika için doğrulama sonucu yoksayılır ve true sertifikanın geçerli olduğunu belirten döndürülür. Sonuçta elde edilen HttpClientHandler nesne, hata ayıklama derlemeleri için oluşturucuya HttpClient bağımsız değişken olarak geçirilmelidir:

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

HTTP düz metin trafiğini etkinleştirme

İsteğe bağlı olarak, iOS ve Android projelerinizi düz metin HTTP trafiğine izin verecek şekilde yapılandırabilirsiniz. Arka uç hizmeti HTTP trafiğine izin verecek şekilde yapılandırılmışsa, temel URL'lerde HTTP belirtebilir ve ardından projelerinizi düz metin trafiğine izin verecek şekilde yapılandırabilirsiniz:

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

iOS ATS geri çevirme

iOS'ta düz metin yerel trafiğini etkinleştirmek için, Info.plist dosyanıza aşağıdakileri ekleyerek ATS'yi geri çevirmeniz gerekir:

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

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

Android'de düz metin yerel trafiğini etkinleştirmek için Kaynaklar/xml klasörüne network_security_config.xml adlı yeni bir XML dosyası ekleyerek bir ağ güvenlik yapılandırması oluşturmanız gerekir. 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>

Ardından, Android Bildirimi'ndeki 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>

Derleme Eylemi'nin AndroidResource olarak ayarlandığından emin olun, aksi takdirde XML dosyası derleme zamanında bulunmaz.