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. 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
localhost
ná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.2
adresy, což je alias rozhraní zpětné smyčky hostitele (127.0.0.1
na 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í
HttpClient
zá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.