iOS simülatörleri 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ü veya Android öykünücüsünde çalışan bir mobil uygulamadan kullanmak yaygındır. Bu, Web hizmetini barındırılan bir uç noktaya dağıtmayı ö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ü veya Android öykünücüsü 'nde çalışan mobil uygulamalar, yerel olarak çalışan ve HTTP üzerinden kullanıma sunulan ASP.NET Core web hizmetlerini şu şekilde kullanabilir:
- İOS simülatörü 'nde çalışan uygulamalar, makineleriniz IP adresiniz aracılığıyla veya ana bilgisayar adı aracılığıyla yerel HTTP Web hizmetlerine bağlanabilir
localhost. Örneğin, göreli URI aracılığıyla bir GET işlemi sunan yerel bir HTTP Web hizmeti verildiğinde/api/todoitems/, iOS simülatörü 'nde çalışan bir uygulama, öğesine BIR get isteği göndererek işlemi tüketebilirhttp://localhost:<port>/api/todoitems/. - Android öykünücüsünde çalışan uygulamalar
10.0.2.2, ana bilgisayar geri döngü arayüzünüzün (geliştirme makinenizde) diğer adı olan adres aracılığıyla yerel http Web hizmetlerine bağlanabilir127.0.0.1. Örneğin, göreli URI aracılığıyla bir GET işlemi sunan yerel bir HTTP Web hizmeti verildiğinde/api/todoitems/, Android öykünücüsü 'nde çalışan bir uygulama, öğesine BIR get isteği göndererek işlemi tüketebilirhttp://10.0.2.2:<port>/api/todoitems/.
Ancak, iOS simülatörü veya Android öykünücüsü 'nde çalışan bir uygulama için HTTPS üzerinden sunulan yerel bir Web hizmetini tüketmek üzere ek çalışma gerekir. Bu senaryo için, işlem aşağıdaki gibidir:
- Makinenizde otomatik olarak imzalanan bir geliştirme sertifikası oluşturun. Daha fazla bilgi için bkz. geliştirme sertifikası oluşturma.
- Projenizi
HttpClienthata ayıklama derlemeniz için uygun ağ yığınını kullanacak şekilde yapılandırın. Daha fazla bilgi için bkz. projenizi yapılandırma. - Yerel makinenizin adresini belirtin. Daha fazla bilgi için bkz. yerel makine adresini belirtme.
- Yerel geliştirme sertifikası güvenlik denetimini atlayın. Daha fazla bilgi için bkz. sertifika güvenlik denetimini atlama.
Her öğe sırasıyla ele alınacaktır.
Geliştirme sertifikası oluşturma
.NET Core SDK yükleme ASP.NET Core HTTPS geliştirme sertifikasını yerel kullanıcı sertifika deposuna yüklenir. Ancak, sertifika yüklendiği sırada güvenilir değildir. Sertifikaya güvenmek için, DotNet aracını çalıştırmak için aşağıdaki tek seferlik adımları gerçekleştirin dev-certs :
dotnet dev-certs https --trust
Aşağıdaki komut araç üzerinde yardım sağlar dev-certs :
dotnet dev-certs https --help
alternatif olarak, HTTPS kullanan bir ASP.NET Core 2,1 projesi (veya üstü) çalıştırdığınızda, Visual Studio geliştirme sertifikasının eksik olup olmadığını algılar ve bu sertifikaya güvenip güvenmesini sağlar.
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
İOS ve Android üzerinde çalışan Xamarin uygulamaları, HttpClient sınıf tarafından yönetilen ağ yığını veya yerel ağ yığınları olmak üzere hangi ağ yığınının kullanıldığını belirtebilir. Yönetilen yığın, mevcut .NET kodu ile 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şlevselliğini sağlamayabilir HttpClient .
iOS
İOS ü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 platformu 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 dosya boyutu için yerel API 'leri 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ı HttpClient , yönetilen ağ yığınını veya yerel AndroidClientHandler ağ yığınını kullanabilir. Varsayılan olarak, yeni Android Platform 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 dosya boyutu 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
İOS simülatörü ve Android öykünücüsü, yerel makinenizde çalışan güvenli Web hizmetlerine erişim sağlar. Ancak, yerel makine adresi her biri için farklıdır.
iOS
İOS simülatörü konak makine ağını kullanır. Bu nedenle, simülatörde çalışan uygulamalar, makineler IP adresi veya ana bilgisayar adı aracılığıyla yerel makinenizde çalışan Web hizmetlerine bağlanabilir localhost . Örneğin, göreli URI aracılığıyla bir GET işlemi sunan yerel bir güvenli Web hizmeti verildiğinde /api/todoitems/ , iOS simülatörü üzerinde çalışan bir uygulama, öğesine BIR get isteği göndererek işlemi tüketebilir https://localhost:<port>/api/todoitems/ .
Not
iOS benzeticisinde Windows bir mobil uygulama çalıştırırken, uygulama Windows uzaktan ios simülatörüiçinde 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 ' de ç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ılmıştır ve sanal bir yönlendiricinin arkasında çalışır. Bu nedenle, öykünülmüş bir cihaz, geliştirme makinenizi veya ağ üzerindeki diğer öykünücü örneklerini göremez.
Ancak, her öykünücü için sanal yönlendirici önceden ayrılmış adresler içeren özel bir ağ alanını yönetir 10.0.2.2 . bu adres, ana bilgisayar geri döngü arabiriminize (geliştirme makinenizde 127.0.0.1) bir diğer ad olacak. Bu nedenle, göreli URI aracılığıyla bir GET işlemi sunan yerel bir güvenli Web hizmeti verildiğinde /api/todoitems/ , Android öykünücüsü üzerinde çalışan bir uygulama, öğesine BIR get isteği göndererek işlemi tüketebilir https://10.0.2.2:<port>/api/todoitems/ .
İşletim sistemini Algıla
DeviceInfoSınıfı, uygulamanın üzerinde çalıştığı platformu algılamak için kullanılabilir. Yerel güvenli Web hizmetlerine erişim sağlayan uygun konak adı, daha sonra 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 daha fazla bilgi için DeviceInfo bkz. DeviceInfo.
Sertifika güvenlik denetimini atla
İOS simülatörü veya Android öykünücüsü 'nde çalışan bir uygulamadan yerel bir güvenli Web hizmeti çağırma girişimi HttpRequestException , her platformda yönetilen ağ yığını kullanılırken bile bir atılmaya neden olur. Bunun nedeni, yerel HTTPS geliştirme sertifikasının otomatik olarak imzalanmasından ve iOS veya Android tarafından otomatik olarak imzalanan sertifikaların güvenmediği yerinizdir. Bu nedenle, bir uygulama yerel bir güvenli Web hizmeti tükettiği zaman SSL hatalarını yok saymanız gerekir. Bu, hem iOS hem de Android 'de yönetilen ve yerel ağ yığınları kullanılırken, ServerCertificateCustomValidationCallback bir nesne üzerindeki özelliği HttpClientHandler Yerel https geliştirme sertifikası için sertifika güvenliği denetiminin sonucunu yok sayan bir geri çağırmaya ayarlayarak 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 yapan sertifika sertifika olmadığında sunucu sertifikası doğrulama sonucu döndürülür localhost . Bu sertifika için, doğrulama sonucu yok sayılır ve true geri döndürülür ve sertifikanın geçerli olduğunu gösterir. Ortaya çıkan HttpClientHandler nesne, HttpClient hata ayıklama derlemeleri için oluşturucuya bir 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 şifresiz metin trafiğini etkinleştir
İsteğe bağlı olarak, iOS ve Android projelerinizi şifresiz metin HTTP trafiğine izin verecek şekilde yapılandırabilirsiniz. Arka uç hizmeti HTTP trafiğine izin verecek şekilde yapılandırıldıysa, temel URL 'lerde HTTP 'yi belirtebilir ve ardından projelerinizi şifresiz 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 katılımı
İOS 'ta şifresiz metin yerel trafiğini etkinleştirmek için, Info. plist dosyasına AŞAĞıDAKINI ekleyerek ATS ' ın geri almanız gerekir:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsLocalNetworking</key>
<true/>
</dict>
Android ağ güvenlik yapılandırması
Android 'de şifresiz metin yerel trafiğini etkinleştirmek için Resources/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 bildirimindeki 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>
Örneği indirin