Xamarin.Forms Zuordnungsinitialisierung und Konfiguration
Das Map
-Steuerelement verwendet das native Kartensteuerelement auf jeder Plattform. Dies bietet eine schnelle, vertraute Kartenumgebung für Benutzer, bedeutet jedoch, dass einige Konfigurationsschritte erforderlich sind, um die API-Anforderungen der einzelnen Plattformen einzuhalten.
Karteninitialisierung
Das Map
Steuerelement wird von der Xamarin.Forms. Maps NuGet-Paket, das jedem Projekt in der Projektmappe hinzugefügt werden soll.
Nach der Installation der Xamarin.Forms. Das NuGet-Paket "Maps" muss in jedem Plattformprojekt initialisiert werden.
Unter iOS sollte dies in AppDelegate.cs auftreten, indem sie die Xamarin.FormsMaps.Init
Methode nach der Xamarin.Forms.Forms.Init
Methode aufruft:
Xamarin.FormsMaps.Init();
Unter Android sollte dies in MainActivity.cs auftreten, indem Sie die Xamarin.FormsMaps.Init
Methode nach der Xamarin.Forms.Forms.Init
Methode aufrufen:
Xamarin.FormsMaps.Init(this, savedInstanceState);
Auf dem Universelle Windows-Plattform (UWP) sollte dies in MainPage.xaml.cs auftreten, indem sie die Xamarin.FormsMaps.Init
Methode aus dem MainPage
Konstruktor aufruft:
Xamarin.FormsMaps.Init("INSERT_AUTHENTICATION_TOKEN_HERE");
Informationen zum für UWP erforderlichen Authentifizierungstoken finden Sie unter Universelle Windows-Plattform.
Sobald das NuGet-Paket hinzugefügt wurde und die Initialisierungsmethode innerhalb jeder Anwendung aufgerufen wird, Xamarin.Forms.Maps
können APIs im freigegebenen Codeprojekt verwendet werden.
Plattformkonfiguration
Zusätzliche Konfiguration ist unter Android und der Universelle Windows-Plattform (UWP) erforderlich, bevor die Karte angezeigt wird. Darüber hinaus erfordert der Zugriff auf den Standort des Benutzers unter iOS, Android und UWP Standortberechtigungen, die der Anwendung erteilt wurden.
iOS
Das Anzeigen und Interagieren mit einer Karte unter iOS erfordert keine zusätzliche Konfiguration. Um jedoch auf Standortdienste zuzugreifen, müssen Sie die folgenden Schlüssel in Info.plist festlegen:
- iOS 11 und höher
NSLocationWhenInUseUsageDescription
– für die Verwendung von Standortdiensten, wenn die Anwendung verwendet wirdNSLocationAlwaysAndWhenInUseUsageDescription
– für die nutzung von Standortdiensten jederzeit
- iOS 10 und früher
NSLocationWhenInUseUsageDescription
– für die Verwendung von Standortdiensten, wenn die Anwendung verwendet wirdNSLocationAlwaysUsageDescription
– für die nutzung von Standortdiensten jederzeit
Zur Unterstützung von iOS 11 und früheren Versionen können Sie alle drei Schlüssel einschließen: NSLocationWhenInUseUsageDescription
, , NSLocationAlwaysAndWhenInUseUsageDescription
und NSLocationAlwaysUsageDescription
.
Die XML-Darstellung für diese Schlüssel in Info.plist wird unten angezeigt. Sie sollten die string
Werte aktualisieren, um anzugeben, wie Ihre Anwendung die Standortinformationen verwendet:
<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>
Die Info.plist-Einträge können auch in der Quellansicht beim Bearbeiten der Info.plist-Datei hinzugefügt werden:
Eine Eingabeaufforderung wird dann angezeigt, wenn die Anwendung versucht, auf den Standort des Benutzers zuzugreifen und Zugriff anzufordern:
Android
Der Konfigurationsprozess zum Anzeigen und Interagieren mit einer Karte auf Android lautet:
- Rufen Sie einen Google Maps-API-Schlüssel ab, und fügen Sie ihn dem Manifest hinzu.
- Geben Sie die Versionsnummer der Google Play-Dienste im Manifest an.
- Geben Sie die Anforderung für die Apache HTTP Legacy-Bibliothek im Manifest an.
- [optional] Geben Sie die WRITE_EXTERNAL_STORAGE Berechtigung im Manifest an.
- [optional] Geben Sie Standortberechtigungen im Manifest an.
- [optional] Fordern Sie Die Berechtigungen für den Laufzeitspeicherort in der
MainActivity
Klasse an.
Ein Beispiel für eine ordnungsgemäß konfigurierte Manifestdatei finden Sie unter AndroidManifest.xml aus der Beispielanwendung.
Rufen Sie einen Google Maps-API-Schlüssel ab
Um die Google Maps-API unter Android zu verwenden, müssen Sie einen API-Schlüssel generieren. Befolgen Sie dazu die Anweisungen zum Abrufen eines Google Maps-API-Schlüssels.
Nachdem Sie einen API-Schlüssel abgerufen haben, muss er innerhalb des <application>
Elements der Datei "Properties/AndroidManifest.xml " hinzugefügt werden:
<application ...>
<meta-data android:name="com.google.android.geo.API_KEY" android:value="PASTE-YOUR-API-KEY-HERE" />
</application>
Dadurch wird der API-Schlüssel in das Manifest eingebettet. Ohne einen gültigen API-Schlüssel zeigt das Map
-Steuerelement ein leeres Raster an.
Hinweis
com.google.android.geo.API_KEY
ist der empfohlene Metadatenname für den API-Schlüssel. Aus Gründen der Abwärtskompatibilität kann der com.google.android.maps.v2.API_KEY
-Metadatenname verwendet werden. Dies ermöglicht jedoch nur die Authentifizierung für die Android Maps API v2.
Damit Ihre APK auf Google Maps zugreifen kann, müssen Sie SHA-1-Fingerabdrücke und Paketnamen für jeden Keystore (Debug und Release) einschließen, den Sie zum Signieren Ihrer APK verwenden. Wenn Sie beispielsweise einen Computer für das Debuggen und einen anderen Computer zum Generieren der Release-APK verwenden, müssen Sie den Fingerabdruck des SHA-1-Zertifikats aus dem Debug-Keystore des ersten Computers und den Fingerabdruck des SHA-1-Zertifikats aus dem Release-Keystore des zweiten Computers angeben. Denken Sie auch daran, die wichtigsten Anmeldeinformationen zu bearbeiten, wenn sich der Paketname der App ändert. Siehe Abrufen eines Google Maps-API-Schlüssels.
Geben Sie die Versionsnummer der Google Play-Dienste an
Fügen Sie die folgende Deklaration im <application>
-Element von AndroidManifest.xml hinzu:
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
Dadurch wird die Version der Google Play-Dienste eingebettet, mit denen die Anwendung kompiliert wurde, in das Manifest.
Angeben der Anforderung für die Apache HTTP Legacy-Bibliothek
Wenn Ihre Xamarin.Forms Anwendung auf API 28 oder höher ausgerichtet ist, müssen Sie die folgende Deklaration innerhalb des <application>
Elements von AndroidManifest.xml hinzufügen:
<uses-library android:name="org.apache.http.legacy" android:required="false" />
Dies weist die Anwendung an, die Apache Http-Clientbibliothek zu verwenden, die aus dem bootclasspath
in Android 9 entfernt wurde.
Angeben der WRITE_EXTERNAL_STORAGE-Berechtigung
Wenn Ihre Anwendung auf API 22 oder niedriger ausgerichtet ist, kann es erforderlich sein, die WRITE_EXTERNAL_STORAGE
Berechtigung zum Manifest als untergeordnetes <manifest>
Element des Elements hinzuzufügen:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Dies ist nicht erforderlich, wenn Ihre Anwendung auf API 23 oder höher ausgerichtet ist.
Angeben von Standortberechtigungen
Wenn Ihre Anwendung auf den Speicherort des Benutzers zugreifen muss, müssen Sie die Berechtigung anfordern, indem Sie das ACCESS_COARSE_LOCATION
ACCESS_FINE_LOCATION
Manifest (oder beide) als untergeordnetes Element hinzufügen <manifest>
:
<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>
Die ACCESS_COARSE_LOCATION
-Berechtigung ermöglicht der API die Verwendung der WLAN- oder mobilen Datenverbindung oder beide, um den Standort des Geräts zu bestimmen. Die ACCESS_FINE_LOCATION
-Berechtigungen ermöglichen der API die Verwendung des globalen Positionierungssystems (GPS), der WLAN- oder mobilen Datenverbindung, den Standort so genau wie möglich zu bestimmen.
Alternativ können diese Berechtigungen mithilfe des Manifest-Editors aktiviert werden, um die folgenden Berechtigungen hinzuzufügen:
AccessCoarseLocation
AccessFineLocation
Diese werden im folgenden Screenshot gezeigt:
Anfordern von Berechtigungen für den Laufzeitspeicherort
Wenn Ihre Anwendung auf API 23 oder höher ausgerichtet ist und auf den Standort des Benutzers zugreifen muss, muss überprüft werden, ob sie zur Laufzeit über die erforderliche Berechtigung verfügt, und sie anfordern, wenn sie sie nicht hat. Dies kann folgendermaßen erfüllt werden:
Fügen Sie in der
MainActivity
Klasse die folgenden Felder hinzu:const int RequestLocationId = 0; readonly string[] LocationPermissions = { Manifest.Permission.AccessCoarseLocation, Manifest.Permission.AccessFineLocation };
Fügen Sie in der
MainActivity
Klasse die folgendeOnStart
Außerkraftsetzung hinzu: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. } } }
Sofern die Anwendung auf API 23 oder höher ausgerichtet ist, führt dieser Code eine Laufzeitberechtigungsprüfung für die
AccessFineLocation
Berechtigung aus. Wenn keine Berechtigung erteilt wurde, erfolgt eine Berechtigungsanforderung durch Aufrufen derRequestPermissions
Methode.Fügen Sie in der
MainActivity
Klasse die folgendeOnRequestPermissionsResult
Außerkraftsetzung hinzu: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); } }
Diese Außerkraftsetzung behandelt das Ergebnis der Berechtigungsanforderung.
Der Gesamteffekt dieses Codes lautet: Wenn die Anwendung den Standort des Benutzers anfordert, wird das folgende Dialogfeld angezeigt, in dem die Berechtigung angefordert wird:
Universelle Windows-Plattform
Auf UWP muss Ihre Anwendung authentifiziert werden, bevor sie kartendienste anzeigen und nutzen kann. Um Ihre Anwendung zu authentifizieren, müssen Sie einen Kartenauthentifizierungsschlüssel angeben. Weitere Informationen finden Sie unter Anfordern eines Kartenauthentifizierungsschlüssels. Das Authentifizierungstoken sollte dann im FormsMaps.Init("AUTHORIZATION_TOKEN")
Methodenaufruf angegeben werden, um die Anwendung mit Bing Maps zu authentifizieren.
Hinweis
Wenn Sie unter UWP Kartendienste wie geocodierung verwenden möchten, müssen Sie die MapService.ServiceToken
Eigenschaft auch auf den Wert des Authentifizierungsschlüssels festlegen. Dies kann mit der folgenden Codezeile erreicht werden: Windows.Services.Maps.MapService.ServiceToken = "INSERT_AUTH_TOKEN_HERE";
.
Wenn Ihre Anwendung auf den Standort des Benutzers zugreifen muss, müssen Sie die Standortfunktion im Paketmanifest aktivieren. Dies kann folgendermaßen erfüllt werden:
Doppelklicken Sie in Projektmappen-Explorer auf "package.appxmanifest", und wählen Sie die Registerkarte "Funktionen" aus.
Aktivieren Sie in der Liste "Funktionen " das Kontrollkästchen für "Speicherort". Dadurch wird der Paketmanifestdatei die
location
Gerätefunktion hinzugefügt.<Capabilities> <!-- DeviceCapability elements must follow Capability elements (if present) --> <DeviceCapability Name="location"/> </Capabilities>
Releasebuilds
UWP-Releasebuilds verwenden die native .NET-Kompilierung, um die Anwendung direkt in systemeigenen Code zu kompilieren. Dies hat jedoch zur Folge, dass der Renderer für das Map
Steuerelement unter UWP aus der ausführbaren Datei verknüpft werden kann. Dies kann mithilfe einer UWP-spezifischen Überladung der Forms.Init
Methode in App.xaml.cs behoben werden:
var assembliesToInclude = new [] { typeof(Xamarin.Forms.Maps.UWP.MapRenderer).GetTypeInfo().Assembly };
Xamarin.Forms.Forms.Init(e, assembliesToInclude);
Dieser Code übergibt die Assembly, in der sich die Xamarin.Forms.Maps.UWP.MapRenderer
Klasse befindet, an die Forms.Init
Methode. Dadurch wird sichergestellt, dass die Assembly nicht aus der ausführbaren Datei durch den systemeigenen Kompilierungsprozess von .NET verknüpft ist.
Wichtig
Wenn Dies nicht der Fall ist, wird das Map
Steuerelement beim Ausführen eines Releasebuilds nicht angezeigt.