Sdílet prostřednictvím


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í:

  1. 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.
  2. 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.
  3. Zadejte adresu místního počítače. Další informace naleznete v tématu Zadání adresy místního počítače.
  4. 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.