Připojení k místním webovým službám ze simulátorů iOSu a emulátorů Androidu
Mnoho mobilních aplikací využívá webové služby. Ve fázi vývoje je běžné nasadit webovou službu místně a využívat ji z mobilní aplikace spuštěné v simulátoru iOSu nebo emulátoru Androidu. Tím se vyhnete tomu, že webovou službu nasadíte do hostovaného koncového bodu, a umožníte jednoduché ladění, protože mobilní aplikace i webová služba běží místně.
Mobilní aplikace běžící v simulátoru iOSu nebo emulátoru Androidu mohou využívat ASP.NET Core služby, které jsou spuštěné místně a vystavené prostřednictvím protokolu HTTP, a to následujícím způsobem:
- Aplikace spuštěné v simulátoru iOS se mohou připojit k místním webovým službám HTTP přes IP adresu vašich počítačů nebo
localhostpřes název hostitele. Například vzhledem k místní webové službě HTTP, která zveřejňuje operaci GET prostřednictvím relativního identifikátoru URI, může aplikace spuštěná v simulátoru iOS operaci využívat odesláním požadavku/api/todoitems/GET dohttp://localhost:<port>/api/todoitems/. - Aplikace spuštěné v emulátoru Androidu se mohou připojit k místním webovým službám HTTP prostřednictvím adresy , což je alias rozhraní zpětné smyčky hostitele ( na
10.0.2.2127.0.0.1vývojovém počítači). Například vzhledem k místní webové službě HTTP, která zveřejňuje operaci GET prostřednictvím relativního identifikátoru URI, může aplikace spuštěná v emulátoru Androidu operaci využívat odesláním požadavku/api/todoitems/GET dohttp://10.0.2.2:<port>/api/todoitems/.
K tomu, aby aplikace spuštěná v simulátoru iOSu nebo emulátoru Androidu spotřebovává místní webovou službu, která je vystavená prostřednictvím protokolu HTTPS, je ale potřeba provést další práci. V tomto scénáři je postup následující:
- Na svém 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 svůj projekt tak, aby pro sestavení
HttpClientladění používat příslušný zásobník sítě. Další informace najdete v tématu Konfigurace projektu. - Zadejte adresu místního počítače. Další informace najdete v tématu Zadání adresy místního počítače.
- Obejít místní kontrolu zabezpečení vývojového certifikátu. Další informace najdete v tématu Obejití kontroly zabezpečení certifikátu.
Jednotlivé položky se budou probíraně diskutovat.
Vytvoření vývojového certifikátu
Instalace .NET Core SDK nainstaluje certifikát ASP.NET Core HTTPS do místního úložiště certifikátů uživatele. I když je ale certifikát nainstalovaný, není důvěryhodný. Pokud chcete certifikátu důvěřovat, spusťte nástroj dotnet pomocí následujícího dev-certs kroku:
dotnet dev-certs https --trust
Následující příkaz poskytuje nápovědu k dev-certs nástroji:
dotnet dev-certs https --help
Případně, když spustíte projekt ASP.NET Core 2.1 (nebo vyšší), který používá protokol HTTPS, služba Visual Studio zjistí, jestli vývojový certifikát chybí, a nabídne možnost jeho instalace a důvěryhodnosti.
Poznámka
Certifikát ASP.NET Core HTTPS je podepsaný svým držitelem.
Další informace o povolení místního HTTPS na vašem počítači najdete v tématu Povolení místního HTTPS.
Konfigurace projektu
Aplikace Xamarin spuštěné v iOSu a Androidu mohou určit, který síťový zásobník třída používá, a volby budou spravované síťové zásobníky nebo nativní síťové HttpClient zásobníky. 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 může mít za následek větší velikost spustitelného souboru. Nativní zásobníky mohou být rychlejší a poskytovat lepší zabezpečení, ale nemusí poskytovat všechny funkce HttpClient třídy.
iOS
Aplikace Xamarin spuštěné v iOSu mohou používat zásobník spravované sítě nebo nativní CFNetwork nebo NSUrlSession síťové zásobníky. Ve výchozím nastavení nové projekty platformy iOS používají zásobník sítě pro podporu protokolu TLS 1.2 a pro lepší výkon a menší velikost spustitelných souborů používají nativní NSUrlSession rozhraní API. Další informace najdete v tématu HttpClient a selektor implementace SSL/TLS pro iOS/macOS.
Android
Aplikace Xamarin běžící na Androidu mohou používat zásobník HttpClient spravované sítě nebo nativní síťový AndroidClientHandler zásobník. Ve výchozím nastavení nové projekty platformy Android používají zásobník sítě pro podporu protokolu TLS 1.2 a pro lepší výkon a menší velikost spustitelného souboru používají nativní AndroidClientHandler rozhraní API. Další informace o síťových zásobníkech Androidu najdete v tématu Zásobník HttpClient a Selektor implementace SSL/TLS pro Android.
Zadání adresy 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 spuštěných na místním počítači. Adresa místního počítače se ale pro každou z nich liší.
iOS
Simulátor iOS používá síť hostitelského počítače. Aplikace spuštěné v simulátoru se proto mohou připojovat k webovým službám běžící na místním počítači prostřednictvím IP adresy počítačů nebo prostřednictvím localhost názvu hostitele. Například vzhledem k místní zabezpečené webové službě, která zveřejňuje operaci GET prostřednictvím relativního identifikátoru URI, může aplikace spuštěná v simulátoru iOS operaci využívat odesláním požadavku /api/todoitems/ GET do https://localhost:<port>/api/todoitems/ .
Poznámka
Při spuštění mobilní aplikace v simulátoru iOS ze Windows se aplikace zobrazí ve vzdáleném simulátoru iOSupro Windows . Aplikace ale běží na spárovaném počítači Mac. Proto neexistuje žádný přístup místního hostitele k webové službě spuštěné v Windows pro aplikaci pro iOS běžící na počítači Mac.
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ývojový počítač nebo 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, a adresa je alias rozhraní zpětné smyčky hostitele 10.0.2.2 (127.0.0.1 na vývojovém počítači). Proto vzhledem k místní zabezpečené webové službě, která zveřejňuje operaci GET prostřednictvím relativního identifikátoru URI, může aplikace spuštěná v emulátoru Androidu operaci využívat odesláním požadavku /api/todoitems/ GET do https://10.0.2.2:<port>/api/todoitems/ .
Zjištění operačního systému
Třídu DeviceInfo lze použít k detekci platformy, na které aplikace běží. Odpovídající název hostitele, který umožňuje přístup k místním zabezpečeným webovým službám, lze nastavit následujícím způsobem:
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 třídě DeviceInfo najdete v článku DeviceInfo
Obejití kontroly zabezpečení certifikátu
Pokus o vyvolání místní zabezpečené webové služby z aplikace spuštěné v simulátoru iOSu nebo emulátoru Androidu vyvolá výjimku, i když na každé platformě použijete zásobník HttpRequestException spravované sítě. Je to proto, že místní vývojový certifikát HTTPS je podepsaný svým držitelem a certifikáty podepsané svým držitelem nejsou pro iOS nebo Android důvěryhodné. Proto je nutné ignorovat chyby SSL, když aplikace využívá místní zabezpečenou webovou službu. Toho lze dosáhnout při použití spravovaných i nativních síťových zásobníků v iOSu a Androidu nastavením vlastnosti objektu na zpětné volání, které ignoruje výsledek kontroly zabezpečení certifikátu pro místní vývojový certifikát ServerCertificateCustomValidationCallbackHttpClientHandler 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 v případě, že certifikát, který prošly ověřováním, není localhost certifikát. Pro tento certifikát se výsledek ověření ignoruje a vrátí se, což true znamená, že certifikát je platný. Výsledný objekt HttpClientHandler by měl být předán jako argument HttpClient konstruktoru pro sestavení ladění:
#if DEBUG
HttpClientHandler insecureHandler = GetInsecureHandler();
HttpClient client = new HttpClient(insecureHandler);
#else
HttpClient client = new HttpClient();
#endif
Povolení přenosu smazat text HTTP
Volitelně můžete projekty pro iOS a Android nakonfigurovat tak, aby povolují přenos HTTP s jasným textem. Pokud je back-endová služba nakonfigurovaná tak, aby povoloval provoz HTTP, můžete v základních adresách URL zadat HTTP a pak nakonfigurovat projekty tak, aby povoloval přenosy s smazatelně 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í z iOS ATS
Pokud chcete v iOSu povolit místní přenos smazat text, měli byste odhlásit ATS přidáním následujícího textu do souboru Info.plist:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsLocalNetworking</key>
<true/>
</dict>
Konfigurace zabezpečení sítě s Androidem
Pokud chcete povolit místní přenos smazat text 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 ve složce 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>
Stažení ukázky