Xamarin.Forms Inicializace a konfigurace mapování

Ovládací Map prvek používá nativní ovládací prvek mapy na každé platformě. To poskytuje uživatelům rychlé a známé prostředí map, ale znamená to, že některé kroky konfigurace jsou potřeba k dodržování požadavků rozhraní API jednotlivých platforem.

Inicializace mapy

Ovládací Map prvek poskytuje Xamarin.Forms.Mapy Balíček NuGet, který by se měl přidat do každého projektu v řešení.

Po instalaci souboru Xamarin.Forms.Mapy Balíček NuGet musí být inicializován v každém projektu platformy.

V iOSu by k tomu mělo dojít v AppDelegate.cs vyvoláním Xamarin.FormsMaps.Init metody za metodou Xamarin.Forms.Forms.Init :

Xamarin.FormsMaps.Init();

V Androidu by k tomu mělo dojít v MainActivity.cs vyvoláním Xamarin.FormsMaps.Init metody za metodou Xamarin.Forms.Forms.Init :

Xamarin.FormsMaps.Init(this, savedInstanceState);

Na Univerzální platforma Windows (UPW) by k tomu mělo dojít v MainPage.xaml.cs vyvoláním Xamarin.FormsMaps.Init metody z konstruktoruMainPage:

Xamarin.FormsMaps.Init("INSERT_AUTHENTICATION_TOKEN_HERE");

Informace o ověřovacím tokenu požadovaném pro UPW najdete v tématu Univerzální platforma Windows.

Po přidání balíčku NuGet a inicializační metody volané uvnitř každé aplikace Xamarin.Forms.Maps lze rozhraní API použít v projektu sdíleného kódu.

Konfigurace platformy

V Androidu se vyžaduje další konfigurace a před zobrazením mapy Univerzální platforma Windows (UPW). Kromě toho přístup k umístění uživatele v iOSu, Androidu a UPW vyžaduje udělení oprávnění k poloze aplikace.

iOS

Zobrazení a interakce s mapou v iOSu nevyžaduje žádnou další konfiguraci. Pokud ale chcete získat přístup ke službám zjišťování polohy, musíte v souboru Info.plist nastavit následující klíče:

Pokud chcete podporovat iOS 11 a starší, můžete zahrnout všechny tři klíče: NSLocationWhenInUseUsageDescription, NSLocationAlwaysAndWhenInUseUsageDescriptiona NSLocationAlwaysUsageDescription.

Reprezentace XML pro tyto klíče v souboru Info.plist je zobrazena níže. Hodnoty byste měli aktualizovat string tak, aby odrážely způsob, jakým vaše aplikace používá informace o poloze:

<key>NSLocationAlwaysUsageDescription</key>
<string>Can we use your location at all times?</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Can we use your location when your application is being used?</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Can we use your location at all times?</string>

Položky Info.plist lze přidat také v zobrazení Zdroj při úpravě souboru Info.plist:

Info.plist pro iOS 8

Zobrazí se výzva, když se aplikace pokusí o přístup k umístění uživatele a požádá o přístup:

Snímek obrazovky s žádostí o oprávnění k umístění v iOSu

Android

Proces konfigurace pro zobrazení a interakci s mapou v Androidu je následující:

  1. Získejte klíč rozhraní API google Mapy a přidejte ho do manifestu.
  2. Zadejte číslo verze služeb Google Play v manifestu.
  3. Zadejte požadavek na knihovnu Apache HTTP Legacy v manifestu.
  4. [volitelné] Zadejte oprávnění WRITE_EXTERNAL_STORAGE v manifestu.
  5. [volitelné] Zadejte oprávnění k umístění v manifestu.
  6. [volitelné] Vyžádejte MainActivity si oprávnění k umístění modulu runtime ve třídě.

Příklad správně nakonfigurovaného souboru manifestu najdete v tématu AndroidManifest.xml z ukázkové aplikace.

Získání klíče rozhraní API Mapy Google

Pokud chcete používat rozhraní API Google Mapy v Androidu, musíte vygenerovat klíč rozhraní API. Postupujte podle pokynů v části Získání klíče rozhraní API google Mapy.

Jakmile získáte klíč rozhraní API, musí se přidat do <application> elementu souboru Properties/AndroidManifest.xml :

<application ...>
    <meta-data android:name="com.google.android.geo.API_KEY" android:value="PASTE-YOUR-API-KEY-HERE" />
</application>

Tím se do manifestu vloží klíč rozhraní API. Bez platného klíče rozhraní API ovládací Map prvek zobrazí prázdnou mřížku.

Poznámka:

com.google.android.geo.API_KEY je doporučený název metadat pro klíč rozhraní API. Pro zpětnou kompatibilitu com.google.android.maps.v2.API_KEY je možné použít název metadat, ale umožňuje ověřování pouze pro rozhraní ANDROID Mapy API v2.

Aby váš APK přístup k Google Mapy, musíte zahrnout SHA-1 otisky prstů a názvy balíčků pro každé úložiště klíčů (ladění a vydání), které používáte k podepsání APK. Pokud například používáte jeden počítač pro ladění a jiný počítač pro generování verze APK, měli byste zahrnout otisk certifikátu SHA-1 z ladicího úložiště klíčů prvního počítače a otisk certifikátu SHA-1 z úložiště klíčů vydané verze druhého počítače. Nezapomeňte také upravit přihlašovací údaje klíče, pokud se změní název balíčku aplikace. Viz Získání klíče rozhraní API Mapy Google.

Zadejte číslo verze služeb Google Play.

Do prvku AndroidManifest.xml přidejte následující deklaraci<application>:

<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />

Tím se do manifestu vloží verze služeb Google Play, se kterými byla aplikace zkompilována.

Určení požadavku na starší knihovnu Apache HTTP

Pokud vaše Xamarin.Forms aplikace cílí na rozhraní API 28 nebo vyšší, musíte do <application> elementu AndroidManifest.xml přidat následující deklaraci:

<uses-library android:name="org.apache.http.legacy" android:required="false" />    

To aplikaci říká, aby používala klientskou knihovnu Apache Http, která byla odebrána z Androidu bootclasspath 9.

Zadání oprávnění WRITE_EXTERNAL_STORAGE

Pokud vaše aplikace cílí na rozhraní API 22 nebo nižší, může být nutné přidat WRITE_EXTERNAL_STORAGE oprávnění k manifestu <manifest> jako podřízený prvek:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

To se nevyžaduje, pokud vaše aplikace cílí na rozhraní API 23 nebo vyšší.

Zadání oprávnění k umístění

Pokud vaše aplikace potřebuje přístup k umístění uživatele, musíte požádat o oprávnění přidáním ACCESS_COARSE_LOCATION nebo ACCESS_FINE_LOCATION oprávnění do manifestu (nebo obojího) jako podřízeného <manifest> prvku:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.myapp">
  ...
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
</manifest>

Oprávnění ACCESS_COARSE_LOCATION umožňuje rozhraní API používat Wi-Fi nebo mobilní data nebo obojí k určení polohy zařízení. Oprávnění ACCESS_FINE_LOCATION umožňují rozhraní API používat globální polohovací systém (GPS), WiFi nebo mobilní data k určení přesného umístění.

Případně můžete tato oprávnění povolit pomocí editoru manifestu a přidat následující oprávnění:

  • AccessCoarseLocation
  • AccessFineLocation

Toto je znázorněno na následujícím snímku obrazovky:

Požadovaná oprávnění pro Android

Vyžádání oprávnění k umístění modulu runtime

Pokud vaše aplikace cílí na rozhraní API 23 nebo novější a potřebuje přístup k umístění uživatele, musí zkontrolovat, jestli má požadovaná oprávnění za běhu, a požádat ho, pokud ho nemá. Toho lze dosáhnout následujícím způsobem:

  1. MainActivity Do třídy přidejte následující pole:

    const int RequestLocationId = 0;
    
    readonly string[] LocationPermissions =
    {
        Manifest.Permission.AccessCoarseLocation,
        Manifest.Permission.AccessFineLocation
    };
    
  2. MainActivity Do třídy přidejte následující OnStart přepsání:

    protected override void OnStart()
    {
        base.OnStart();
    
        if ((int)Build.VERSION.SdkInt >= 23)
        {
            if (CheckSelfPermission(Manifest.Permission.AccessFineLocation) != Permission.Granted)
            {
                RequestPermissions(LocationPermissions, RequestLocationId);
            }
            else
            {
                // Permissions already granted - display a message.
            }
        }
    }
    

    Za předpokladu, že aplikace cílí na rozhraní API 23 nebo vyšší, tento kód provede kontrolu oprávnění modulu runtime pro AccessFineLocation dané oprávnění. Pokud oprávnění nebylo uděleno, je žádost o oprávnění provedena voláním RequestPermissions metody.

  3. MainActivity Do třídy přidejte následující OnRequestPermissionsResult přepsání:

    public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults)
    {
        if (requestCode == RequestLocationId)
        {
            if ((grantResults.Length == 1) && (grantResults[0] == (int)Permission.Granted))
                // Permissions granted - display a message.
            else
                // Permissions denied - display a message.
        }
        else
        {
            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
    

    Toto přepsání zpracovává výsledek žádosti o oprávnění.

Celkový účinek tohoto kódu je, že když aplikace požádá o umístění uživatele, zobrazí se následující dialogové okno, které požaduje oprávnění:

Snímek obrazovky s žádostí o oprávnění k umístění v Androidu

Univerzální platforma Windows

V UPW musí být vaše aplikace ověřená, než může zobrazit mapu a využívat mapové služby. Pokud chcete aplikaci ověřit, musíte zadat ověřovací klíč mapy. Další informace najdete v tématu Žádost o ověřovací klíč mapy. Ověřovací token by se pak měl zadat ve FormsMaps.Init("AUTHORIZATION_TOKEN") volání metody, aby se aplikace ověřila pomocí Mapy Bingu.

Poznámka:

Pokud chcete v UPW použít mapové služby, jako je geokódování, musíte také nastavit MapService.ServiceToken vlastnost na hodnotu ověřovacího klíče. Toho lze dosáhnout následujícím řádkem kódu: Windows.Services.Maps.MapService.ServiceToken = "INSERT_AUTH_TOKEN_HERE";.

Kromě toho, pokud vaše aplikace potřebuje přístup k umístění uživatele, musíte povolit funkci umístění v manifestu balíčku. Toho lze dosáhnout následujícím způsobem:

  1. V Průzkumník řešení poklikejte na package.appxmanifest a vyberte kartu Schopnosti.

  2. V seznamu Schopnosti zaškrtněte políčko Umístění. Tím se funkce zařízení přidá location do souboru manifestu balíčku.

    <Capabilities>
      <!-- DeviceCapability elements must follow Capability elements (if present) -->
      <DeviceCapability Name="location"/>
    </Capabilities>
    

Sestavení vydaných verzí

Sestavení verzí UPW používají nativní kompilaci .NET ke kompilaci aplikace přímo do nativního kódu. Následkem toho je však to, že renderer pro ovládací prvek pro Map UPW může být propojený ze spustitelného souboru. To lze opravit pomocí přetížení Forms.Init metody specifické pro UPW v App.xaml.cs:

var assembliesToInclude = new [] { typeof(Xamarin.Forms.Maps.UWP.MapRenderer).GetTypeInfo().Assembly };
Xamarin.Forms.Forms.Init(e, assembliesToInclude);

Tento kód předá sestavení, ve kterém Xamarin.Forms.Maps.UWP.MapRenderer se třída nachází, metodě Forms.Init . Tím se zajistí, že sestavení není propojeno ze spustitelného souboru nativním procesem kompilace .NET.

Důležité

Pokud to Map neuděláte, při spuštění sestavení vydané verze se ovládací prvek nezobrazí.