Připojení k místním webovým službám z emulátorů Androidu a simulátorů iOS
Mnoho mobilních a desktopových aplikací využívá webové služby. Během fáze vývoje softwaru je běžné nasadit webovou službu místně a využívat ji z aplikace spuštěné v emulátoru Androidu nebo simulátoru iOS. Tím se zabrání nasazení webové služby do hostovaného koncového bodu a umožňuje jednoduché ladění, protože aplikace i webová služba běží místně.
Aplikace .NET Multi-Platform App UI (.NET MAUI), které běží ve Windows nebo MacCatalystu, můžou využívat webové služby ASP.NET Core spuštěné místně přes PROTOKOL HTTP nebo HTTPS bez jakékoli další práce za předpokladu, že jste důvěřovali vývojovému certifikátu. Pokud ale aplikace běží v emulátoru Androidu nebo simulátoru iOS, vyžaduje se další práce a proces se liší v závislosti na tom, jestli webová služba běží přes PROTOKOL HTTP nebo HTTPS.
Adresa místního počítače
Emulátor Androidu i simulátor iOS poskytují přístup k webovým službám běžícím přes PROTOKOL HTTP nebo HTTPS na místním počítači. Adresa místního počítače se ale pro každý z nich liší.
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í 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 http://10.0.2.2:<port>/api/todoitems/
nebo https://10.0.2.2:<port>/api/todoitems/
.
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 tomu, že místní 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 simulátoru iOS tuto operaci využívat odesláním požadavku GET do http://localhost:<port>/api/todoitems/
nebo https://localhost:<port>/api/todoitems/
.
Poznámka:
Při spuštění aplikace .NET MAUI v simulátoru iOS z Windows se aplikace zobrazí ve vzdáleném simulátoru iOS pro Windows. Aplikace je ale spuštěná na spárovaných počítačích Mac. 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.
Místní webové služby spuštěné přes HTTP
Aplikace .NET MAUI spuštěná v emulátoru Androidu nebo simulátoru iOS může využívat webovou službu ASP.NET Core spuštěnou místně přes protokol HTTP. Toho lze dosáhnout tak, že nakonfigurujete projekt aplikace .NET MAUI a projekt webové služby ASP.NET Core tak, aby umožňoval přenosy HTTP s vymazáním textu.
V kódu, který definuje adresu URL místní webové služby v aplikaci .NET MAUI, ujistěte se, že adresa URL webové služby určuje schéma HTTP a správný název hostitele. Třídu DeviceInfo je možné použít ke zjištění platformy, na které je aplikace spuštěná. Správný název hostitele pak můžete nastavit takto:
public static string BaseAddress =
DeviceInfo.Platform == DevicePlatform.Android ? "http://10.0.2.2:5000" : "http://localhost:5000";
public static string TodoItemsUrl = $"{BaseAddress}/api/todoitems/";
Další informace o třídě najdete v tématu Informace o DeviceInfozařízení.
Pokud chcete aplikaci spustit na Androidu, musíte přidat požadovanou konfiguraci sítě a spustit aplikaci v iOSu, musíte se odhlásit ze služby Apple Transport Security (ATS). Další informace najdete v tématu Konfigurace sítě Android a konfigurace ATS pro iOS.
Musíte také zajistit, aby webová služba ASP.NET Core byla nakonfigurovaná tak, aby povolovala provoz HTTP. Toho lze dosáhnout přidáním profilu HTTP do profiles
části launchSettings.json v projektu webové služby ASP.NET Core:
{
...
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "api/todoitems",
"applicationUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
...
}
}
Aplikace .NET MAUI spuštěná v emulátoru Androidu nebo simulátoru iOS pak může využívat webovou službu ASP.NET Core spuštěnou místně přes protokol HTTP za předpokladu http
, že je webová služba spuštěná s profilem.
Konfigurace sítě Pro Android
Existují dva hlavní přístupy k povolení místního provozu s jasným textem v Androidu:
- Povolte pro komunikaci se všemi doménami přenosy v síti s jasným textem. Další informace najdete v tématu Povolení síťového provozu s vymazáním textu pro všechny domény.
- Povolení síťového provozu s vymazáním textu pro komunikaci s doménou
localhost
Další informace najdete v tématu Povolení síťového provozu s vymazáním textu pro doménu localhost.
Povolení textového síťového provozu pro všechny domény
Přenosy v síti s vymazáním textu pro všechny domény lze povolit nastavením UsesCleartextTraffic
vlastnosti atributu Application
na true
. To by se mělo provést v souboru Platformy > pro Android > MainApplication.cs v projektu aplikace .NET MAUI a mělo by se zabalit do balíčku #if DEBUG
, aby se zajistilo, že není omylem povolený v produkční aplikaci:
#if DEBUG
[Application(UsesCleartextTraffic = true)]
#else
[Application]
#endif
public class MainApplication : MauiApplication
{
public MainApplication(IntPtr handle, JniHandleOwnership ownership)
: base(handle, ownership)
{
}
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
}
Poznámka:
Vlastnost UsesCleartextTraffic
je ignorována v androidu 7.0 (API 24) a vyšší, pokud je k dispozici konfigurační soubor zabezpečení sítě.
Povolení textového síťového provozu pro doménu localhost
Přenosy v síti s vymazáním textu pro localhost
doménu je možné povolit vytvořením konfiguračního souboru zabezpečení sítě. Toho lze dosáhnout přidáním nového souboru XML s názvem network_security_config.xml do složky Platforms\Android\Resources\xml v projektu aplikace .NET MAUI. 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>
Poznámka:
Ujistěte se, že je akce sestavení souboru network_security_config.xml nastavená na AndroidResource.
Potom nakonfigurujte vlastnost networkSecurityConfig na uzlu aplikace v souboru Platforms\Android\AndroidManifest.xml v projektu aplikace .NET MAUI:
<?xml version="1.0" encoding="utf-8"?>
<manifest>
<application android:networkSecurityConfig="@xml/network_security_config" ...>
...
</application>
</manifest>
Další informace o konfiguračních souborech zabezpečení sítě najdete v tématu Konfigurace zabezpečení sítě na developer.android.com.
Konfigurace ATS pro iOS
Pokud chcete povolit místní přenosy v iOSu, měli byste se v aplikaci .NET MAUI odhlásit ze služby Apple Transport Security (ATS). Toho lze dosáhnout přidáním následující konfigurace do souboru Platforms\iOS\Info.plist v projektu aplikace .NET MAUI:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsLocalNetworking</key>
<true/>
</dict>
Další informace o ATS naleznete v tématu Prevence nezabezpečených síťových připojení na developer.apple.com.
Místní webové služby spuštěné přes HTTPS
Aplikace .NET MAUI spuštěná v emulátoru Androidu nebo simulátoru iOS může využívat webovou službu ASP.NET Core, která běží místně přes PROTOKOL HTTPS. Postup povolení je následující:
- Důvěřovat vývojovému certifikátu podepsanému svým držitelem na vašem počítači. Další informace najdete v tématu Důvěryhodnost vývojového certifikátu.
- 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.
Důvěřovat vývojovému 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.
Zadejte adresu místního počítače.
V kódu, který definuje adresu URL místní webové služby v aplikaci .NET MAUI, ujistěte se, že adresa URL webové služby určuje schéma HTTPS a správný název hostitele. Třídu DeviceInfo je možné použít ke zjištění platformy, na které je aplikace spuštěná. Správný název hostitele pak můžete 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 třídě najdete v tématu Informace o DeviceInfozařízení.
Obejití kontroly zabezpečení certifikátu
Pokus o vyvolání místní zabezpečené webové služby z aplikace .NET MAUI spuštěné v emulátoru Androidu způsobí java.security.cert.CertPathValidatorException
vyvolání zprávy s oznámením, že se nenašlo ukotvení důvěryhodnosti pro cestu certifikace. Podobně pokus o vyvolání místní zabezpečené webové služby z aplikace .NET MAUI spuštěné v simulátoru iOS způsobí NSURLErrorDomain
chybu se zprávou, že certifikát pro server je neplatný. K těmto chybám dochází, protož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 Android nebo iOS. Proto je nutné ignorovat chyby SSL, když aplikace využívá místní zabezpečenou webovou službu.
Toho lze dosáhnout konfigurací instance HttpClientHandler s vlastní ServerCertificateCustomValidationCallback, která dává třídě pokyn HttpClient , aby důvěřovala komunikaci localhost přes HTTPS. Následující příklad ukazuje, jak vytvořit instanci HttpClientHandler , která bude ignorovat chyby ověření certifikátu localhost:
var handler = new HttpClientHandler();
#if DEBUG
handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) =>
{
if (cert != null && cert.Issuer.Equals("CN=localhost"))
return true;
return errors == System.Net.Security.SslPolicyErrors.None;
};
#endif
var client = new HttpClient(handler);
Důležité
Výše uvedený kód ignoruje chyby ověření certifikátu localhost, ale pouze v sestaveních ladění. Tento přístup zabraňuje incidentům zabezpečení v produkčních buildech.
Aplikace .NET MAUI spuštěná v emulátoru Androidu nebo simulátoru iOS pak může využívat webovou službu ASP.NET Core spuštěnou místně přes PROTOKOL HTTPS.