Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Mnoho mobilních aplikací využívá webové služby. Během fáze vývoje je běžné nasadit webovou službu místně a využívat ji z mobilní aplikace spuštěné v simulátoru iOS nebo emulátoru Androidu. Tím se zabrání nasazení webové služby do hostovaného koncového bodu a umožňuje jednoduché ladění, protože mobilní aplikace i webová služba běží místně.
Mobilní aplikace spuštěné v simulátoru iOS nebo emulátoru Androidu můžou využívat webové služby ASP.NET Core, které běží místně, a zpřístupnit přes protokol HTTP následujícím způsobem:
- Aplikace spuštěné v simulátoru iOS se můžou připojit k místním webovým službám HTTP prostřednictvím IP adresy počítačů nebo prostřednictvím
localhostnázvu hostitele. Například vzhledem k tomu, že místní webová služba HTTP, která zveřejňuje operaci GET prostřednictvím relativního/api/todoitems/identifikátoru URI, může aplikace spuštěná v simulátoru iOS tuto operaci využívat odesláním požadavku GET .http://localhost:<port>/api/todoitems/ - Aplikace spuštěné v emulátoru Androidu se můžou připojit k místním webovým službám HTTP prostřednictvím
10.0.2.2adresy, což je alias rozhraní zpětné smyčky hostitele (127.0.0.1na vašem vývojovém počítači). Například vzhledem k tomu, že místní webová služba HTTP, která zveřejňuje operaci GET prostřednictvím relativního identifikátoru/api/todoitems/URI, může aplikace spuštěná v emulátoru Androidu tuto operaci využívat odesláním požadavku GET .http://10.0.2.2:<port>/api/todoitems/
Pro aplikaci spuštěnou v simulátoru iOSu nebo emulátoru Androidu je však potřeba další práce, která využívá místní webovou službu, která je vystavená prostřednictvím protokolu HTTPS. V tomto scénáři je proces následující:
- Na počítači vytvořte certifikát pro vývoj podepsaný svým držitelem. Další informace najdete v tématu Vytvoření vývojového certifikátu.
- Nakonfigurujte projekt tak, aby pro sestavení ladění používal odpovídající
HttpClientzásobník sítě. Další informace najdete v tématu Konfigurace projektu. - Zadejte adresu místního počítače. Další informace naleznete v tématu Zadání adresy místního počítače.
- Obejít kontrolu zabezpečení místního vývojového certifikátu. Další informace najdete v tématu Obejití kontroly zabezpečení certifikátu.
Jednotlivé položky budou probrány naopak.
Vytvoření vývojového certifikátu
Instalace sady .NET Core SDK nainstaluje vývojový certifikát ASP.NET Core HTTPS do místního úložiště certifikátů uživatele. I když je však certifikát nainstalovaný, není důvěryhodný. Pokud chcete certifikátu důvěřovat, spusťte pomocí následujícího jednorázového kroku nástroj dotnet dev-certs :
dotnet dev-certs https --trust
Následující příkaz poskytuje nápovědu k nástroji dev-certs :
dotnet dev-certs https --help
Případně když spustíte projekt ASP.NET Core 2.1 (nebo novější), který používá HTTPS, Visual Studio zjistí, jestli chybí vývojový certifikát, a nabídne instalaci a důvěřování.
Poznámka:
Vývojový certifikát ASP.NET Core HTTPS je podepsaný svým držitelem.
Další informace o povolení místního https na počítači najdete v tématu Povolení místního HTTPS.
Konfigurace projektu
Aplikace Xamarin spuštěné v iOSu a Androidu můžou určit, který síťový zásobník třída používá HttpClient , s volbami spravovaného zásobníku sítě nebo nativními zásobníky sítě. Spravovaný zásobník poskytuje vysokou úroveň kompatibility s existujícím kódem .NET, ale je omezený na protokol TLS 1.0 a může být pomalejší a vést k větší velikosti spustitelného souboru. Nativní zásobníky můžou být rychlejší a poskytují lepší zabezpečení, ale nemusí poskytovat všechny funkce HttpClient třídy.
iOS
Aplikace Xamarin spuštěné v iOSu můžou používat sadu spravovaných sítí nebo nativní CFNetwork nebo NSUrlSession síťové zásobníky. Nové projekty platformy iOS ve výchozím nastavení používají NSUrlSession zásobník sítě, podporují protokol TLS 1.2 a používají nativní rozhraní API pro lepší výkon a menší velikost spustitelného souboru. Další informace najdete v tématu HttpClient a SSL/TLS implementace selektor pro iOS/macOS.
Android
Aplikace Xamarin spuštěné v Androidu můžou používat sadu spravovaných HttpClient sítí nebo nativní AndroidClientHandler zásobník sítě. Nové projekty platformy Android ve výchozím nastavení používají AndroidClientHandler zásobník sítě k podpoře protokolu TLS 1.2 a používají nativní rozhraní API pro lepší výkon a menší velikost spustitelného souboru. Další informace o síťových zásobníkech Androidu naleznete v tématu HttpClient Stack a SSL/TLS Implementace selektor pro Android.
Zadejte adresu místního počítače.
Simulátor iOS i emulátor Android poskytují přístup k zabezpečeným webovým službám běžícím na místním počítači. Adresa místního počítače se ale pro každý z nich liší.
iOS
Simulátor iOSu používá síť hostitelského počítače. Aplikace spuštěné v simulátoru se proto můžou připojit k webovým službám běžícím na místním počítači prostřednictvím IP adresy počítačů nebo názvu localhost hostitele. Například vzhledem k místní zabezpečené webové službě, která zveřejňuje operaci GET prostřednictvím relativního /api/todoitems/ identifikátoru URI, může aplikace spuštěná v simulátoru iOS tuto operaci využívat odesláním požadavku GET do https://localhost:<port>/api/todoitems/.
Poznámka:
Při spuštění mobilní aplikace v simulátoru iOS ze systému Windows se aplikace zobrazí ve vzdáleném simulátoru iOS pro Windows. Aplikace ale běží na spárovaném Macu. Proto neexistuje přístup místního hostitele k webové službě spuštěné ve Windows pro aplikaci pro iOS běžící na Macu.
Android
Každá instance emulátoru Androidu je izolovaná od síťových rozhraní vývojového počítače a běží za virtuálním směrovačem. Emulované zařízení proto nevidí váš vývojový počítač ani jiné instance emulátoru v síti.
Virtuální směrovač pro každý emulátor ale spravuje speciální síťový prostor, který obsahuje předem přidělené adresy, přičemž 10.0.2.2 adresa je alias rozhraní zpětné smyčky hostitele (127.0.0.1 na vašem vývojovém počítači). Vzhledem k tomu, že místní zabezpečená webová služba, která zveřejňuje operaci GET prostřednictvím relativního identifikátoru /api/todoitems/ URI, může aplikace spuštěná v emulátoru Androidu tuto operaci využívat odesláním požadavku GET do https://10.0.2.2:<port>/api/todoitems/.
Zjištění operačního systému
Třídu DeviceInfo lze použít ke zjištění platformy, na které aplikace běží. Příslušný název hostitele, který umožňuje přístup k místním zabezpečeným webovým službám, je pak možné nastavit takto:
public static string BaseAddress =
DeviceInfo.Platform == DevicePlatform.Android ? "https://10.0.2.2:5001" : "https://localhost:5001";
public static string TodoItemsUrl = $"{BaseAddress}/api/todoitems/";
Další informace o DeviceInfo třídě naleznete v tématu Xamarin.Essentials: Informace o zařízení.
Obejití kontroly zabezpečení certifikátu
Při pokusu o vyvolání místní zabezpečené webové služby z aplikace spuštěné v simulátoru iOSu nebo emulátoru Androidu dojde HttpRequestException k vyvolání, a to i při použití spravovaného zásobníku sítě na každé platformě. Důvodem je to, že místní vývojový certifikát HTTPS je podepsaný svým držitelem a certifikáty podepsané svým držitelem nejsou důvěryhodné pro iOS nebo Android. Proto je nutné ignorovat chyby SSL, když aplikace využívá místní zabezpečenou webovou službu. To lze provést při použití spravovaných i nativních síťových zásobníků v iOSu a Androidu nastavením ServerCertificateCustomValidationCallback vlastnosti objektu na HttpClientHandler zpětné volání, které ignoruje výsledek kontroly zabezpečení certifikátu pro místní vývojový certifikát HTTPS:
// 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;
}
V tomto příkladu kódu se vrátí výsledek ověření certifikátu serveru, když certifikát, který prošl ověřením localhost , není certifikát. U tohoto certifikátu se výsledek ověření ignoruje a true vrátí se, což znamená, že certifikát je platný. Výsledný HttpClientHandler objekt by měl být předán jako argument konstruktoru HttpClient pro sestavení ladění:
#if DEBUG
HttpClientHandler insecureHandler = GetInsecureHandler();
HttpClient client = new HttpClient(insecureHandler);
#else
HttpClient client = new HttpClient();
#endif
Povolení textového provozu HTTP s vymazáním textu
Volitelně můžete nakonfigurovat projekty pro iOS a Android tak, aby umožňovaly přenosy HTTP s prostým textem. Pokud je back-endová služba nakonfigurovaná tak, aby umožňovala provoz HTTP, můžete zadat HTTP v základních adresách URL a pak nakonfigurovat projekty tak, aby povolovaly přenosy s prostým textem:
public static string BaseAddress =
DeviceInfo.Platform == DevicePlatform.Android ? "http://10.0.2.2:5000" : "http://localhost:5000";
public static string TodoItemsUrl = $"{BaseAddress}/api/todoitems/";
Odhlášení ats pro iOS
Pokud chcete povolit místní přenosy v iOSu s jasným textem, měli byste se z ATS odhlásit přidáním následujícího příkazu do souboru Info.plist :
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsLocalNetworking</key>
<true/>
</dict>
Konfigurace zabezpečení sítě Pro Android
Pokud chcete povolit místní přenosy s jasným textem v Androidu, měli byste vytvořit konfiguraci zabezpečení sítě přidáním nového souboru XML s názvem network_security_config.xml do složky Resources/xml . Soubor XML by měl zadat následující konfiguraci:
<?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>
Potom nakonfigurujte vlastnost networkSecurityConfig na uzlu aplikace v manifestu Androidu:
<?xml version="1.0" encoding="utf-8"?>
<manifest>
<application android:networkSecurityConfig="@xml/network_security_config">
...
</application>
</manifest>
Ujistěte se, že je akce sestavení nastavená jako AndroidResource, jinak se soubor XML v době sestavení nenajde.