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. Mapuje balíček NuGet, který by se měl přidat do každého projektu v řešení.
Po instalaci souboru Xamarin.Forms. Balíček NuGet Maps 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:
- iOS 11 a novější
NSLocationWhenInUseUsageDescription
– pro používání služeb zjišťování polohy, pokud se aplikace používáNSLocationAlwaysAndWhenInUseUsageDescription
– pro používání služeb zjišťování polohy za všech okolností
- iOS 10 a starší
NSLocationWhenInUseUsageDescription
– pro používání služeb zjišťování polohy, pokud se aplikace používáNSLocationAlwaysUsageDescription
– pro používání služeb zjišťování polohy za všech okolností
Pokud chcete podporovat iOS 11 a starší, můžete zahrnout všechny tři klíče: NSLocationWhenInUseUsageDescription
, NSLocationAlwaysAndWhenInUseUsageDescription
a 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:
Zobrazí se výzva, když se aplikace pokusí o přístup k umístění uživatele a požádá o přístup:
Android
Proces konfigurace pro zobrazení a interakci s mapou v Androidu je následující:
- Získejte klíč rozhraní API Služby Google Maps a přidejte ho do manifestu.
- Zadejte číslo verze služeb Google Play v manifestu.
- Zadejte požadavek na knihovnu Apache HTTP Legacy v manifestu.
- [volitelné] Zadejte oprávnění WRITE_EXTERNAL_STORAGE v manifestu.
- [volitelné] Zadejte oprávnění k umístění v manifestu.
- [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 Služby Google Maps
Pokud chcete používat rozhraní API Google Maps na Androidu, musíte vygenerovat klíč rozhraní API. Postupujte podle pokynů v části Získání klíče rozhraní API Google Maps.
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 v rozhraní API Služby Mapy Pro Android v2.
Aby váš APK přístup k Google Maps, 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 Google Maps.
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:
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:
MainActivity
Do třídy přidejte následující pole:const int RequestLocationId = 0; readonly string[] LocationPermissions = { Manifest.Permission.AccessCoarseLocation, Manifest.Permission.AccessFineLocation };
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ímRequestPermissions
metody.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í:
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í Map Bing.
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:
V Průzkumník řešení poklikejte na package.appxmanifest a vyberte kartu Schopnosti.
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í.