Xamarin.Forms Inicjowanie i konfiguracja mapy
Kontrolka Map
używa natywnej kontrolki mapy na każdej platformie. Zapewnia to szybkie, znane środowisko map dla użytkowników, ale oznacza to, że niektóre kroki konfiguracji są wymagane do spełnienia wymagań interfejsu API poszczególnych platform.
Inicjowanie mapy
Kontrolka Map
jest dostarczana przez element Xamarin.Forms. Mapuje pakiet NuGet, który powinien zostać dodany do każdego projektu w rozwiązaniu.
Po zainstalowaniu programu Xamarin.Forms. Mapuje pakiet NuGet, który musi zostać zainicjowany w każdym projekcie platformy.
W systemie iOS powinno to nastąpić w AppDelegate.cs przez wywołanie Xamarin.FormsMaps.Init
metody po metodzie Xamarin.Forms.Forms.Init
:
Xamarin.FormsMaps.Init();
W systemie Android powinno to nastąpić w MainActivity.cs przez wywołanie Xamarin.FormsMaps.Init
metody po metodzie Xamarin.Forms.Forms.Init
:
Xamarin.FormsMaps.Init(this, savedInstanceState);
W platforma uniwersalna systemu Windows (UWP) powinno to nastąpić w MainPage.xaml.cs przez wywołanie Xamarin.FormsMaps.Init
metody z konstruktoraMainPage
:
Xamarin.FormsMaps.Init("INSERT_AUTHENTICATION_TOKEN_HERE");
Aby uzyskać informacje na temat tokenu uwierzytelniania wymaganego na platformie UWP, zobacz platforma uniwersalna systemu Windows.
Po dodaniu pakietu NuGet i wywołaniu metody inicjowania wewnątrz każdej aplikacji Xamarin.Forms.Maps
interfejsy API mogą być używane w projekcie kodu udostępnionego.
Konfiguracja platformy
Wymagana jest dodatkowa konfiguracja w systemie Android i platforma uniwersalna systemu Windows (UWP) przed wyświetleniem mapy. Ponadto w systemach iOS, Android i UWP uzyskiwanie dostępu do lokalizacji użytkownika wymaga udzielenia aplikacji uprawnień do lokalizacji.
iOS
Wyświetlanie mapy i interakcja z nią w systemie iOS nie wymaga żadnej dodatkowej konfiguracji. Jednak aby uzyskać dostęp do usług lokalizacji, należy ustawić następujące klucze w pliku Info.plist:
- System iOS 11 lub nowszy
NSLocationWhenInUseUsageDescription
— do korzystania z usług lokalizacji, gdy aplikacja jest w użyciuNSLocationAlwaysAndWhenInUseUsageDescription
– do korzystania z usług lokalizacji przez cały czas
- System iOS 10 i starsze wersje
NSLocationWhenInUseUsageDescription
— do korzystania z usług lokalizacji, gdy aplikacja jest w użyciuNSLocationAlwaysUsageDescription
– do korzystania z usług lokalizacji przez cały czas
Aby obsługiwać system iOS 11 i starsze, możesz uwzględnić wszystkie trzy klucze: NSLocationWhenInUseUsageDescription
, NSLocationAlwaysAndWhenInUseUsageDescription
i NSLocationAlwaysUsageDescription
.
Poniżej przedstawiono reprezentację XML dla tych kluczy w pliku Info.plist . Należy zaktualizować wartości, string
aby odzwierciedlić sposób używania informacji o lokalizacji aplikacji:
<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>
Wpisy Info.plist można również dodać w widoku źródłowym podczas edytowania pliku Info.plist:
Monit jest następnie wyświetlany, gdy aplikacja próbuje uzyskać dostęp do lokalizacji użytkownika, żądając dostępu:
Android
Proces konfiguracji do wyświetlania mapy w systemie Android i interakcji z nią to:
- Pobierz klucz interfejsu API usługi Google Maps i dodaj go do manifestu.
- Określ numer wersji usług Google Play w manifeście.
- Określ wymaganie dotyczące starszej biblioteki apache HTTP w manifeście.
- [opcjonalnie] Określ uprawnienie WRITE_EXTERNAL_STORAGE w manifeście.
- [opcjonalnie] Określ uprawnienia lokalizacji w manifeście.
- [opcjonalnie] Zażądaj uprawnień lokalizacji środowiska uruchomieniowego
MainActivity
w klasie .
Aby zapoznać się z przykładem poprawnie skonfigurowanego pliku manifestu, zobacz AndroidManifest.xml z przykładowej aplikacji.
Uzyskiwanie klucza interfejsu API usługi Google Maps
Aby korzystać z interfejsu API usługi Google Maps w systemie Android, musisz wygenerować klucz interfejsu API. W tym celu postępuj zgodnie z instrukcjami w temacie Uzyskiwanie klucza interfejsu API usługi Google Maps.
Po uzyskaniu klucza interfejsu API należy go dodać w <application>
elemekcie Właściwości/AndroidManifest.xml pliku:
<application ...>
<meta-data android:name="com.google.android.geo.API_KEY" android:value="PASTE-YOUR-API-KEY-HERE" />
</application>
Spowoduje to osadzenie klucza interfejsu API w manifeście. Bez prawidłowego klucza interfejsu API kontrolka Map
wyświetli pustą siatkę.
Uwaga
com.google.android.geo.API_KEY
to zalecana nazwa metadanych klucza interfejsu API. Aby zapewnić zgodność z poprzednimi wersjami, com.google.android.maps.v2.API_KEY
można użyć nazwy metadanych, ale umożliwia uwierzytelnianie tylko interfejsowi API map systemu Android w wersji 2.
Aby plik APK uzyskiwał dostęp do usługi Google Maps, należy dołączyć odciski palców SHA-1 i nazwy pakietów dla każdego magazynu kluczy (debugowania i wydawania), którego używasz do podpisywania pakietu APK. Jeśli na przykład używasz jednego komputera do debugowania i innego komputera do generowania wersji APK, należy dołączyć odcisk palca certyfikatu SHA-1 z magazynu kluczy debugowania pierwszego komputera i odcisk palca certyfikatu SHA-1 z magazynu kluczy wydania drugiego komputera. Pamiętaj również, aby edytować poświadczenia klucza, jeśli nazwa pakietu aplikacji ulegnie zmianie. Zobacz Uzyskiwanie klucza interfejsu API usługi Google Maps.
Określanie numeru wersji usług Google Play
Dodaj następującą deklarację w <application>
elemecie AndroidManifest.xml:
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
Spowoduje to osadzenie wersji usług Google Play skompilowanych za pomocą aplikacji w manifeście.
Określanie wymagania dla starszej biblioteki apache HTTP
Jeśli aplikacja Xamarin.Forms jest przeznaczona dla interfejsu API 28 lub nowszego, należy dodać następującą deklarację w <application>
elemecie AndroidManifest.xml:
<uses-library android:name="org.apache.http.legacy" android:required="false" />
Spowoduje to, że aplikacja będzie używać biblioteki klienta Apache Http, która została usunięta z programu bootclasspath
w systemie Android 9.
Określanie uprawnienia WRITE_EXTERNAL_STORAGE
Jeśli aplikacja jest przeznaczona dla interfejsu API 22 lub niższego, może być konieczne dodanie WRITE_EXTERNAL_STORAGE
uprawnienia do manifestu jako element podrzędny <manifest>
elementu:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Nie jest to wymagane, jeśli aplikacja jest przeznaczona dla interfejsu API 23 lub nowszego.
Określanie uprawnień do lokalizacji
Jeśli aplikacja musi uzyskać dostęp do lokalizacji użytkownika, musisz zażądać uprawnień przez dodanie ACCESS_COARSE_LOCATION
uprawnień lub ACCESS_FINE_LOCATION
do manifestu (lub obu), jako element podrzędny <manifest>
elementu:
<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>
Uprawnienie ACCESS_COARSE_LOCATION
umożliwia interfejsowi API używanie sieci Wi-Fi lub danych mobilnych lub obu tych elementów w celu określenia lokalizacji urządzenia. Uprawnienia ACCESS_FINE_LOCATION
umożliwiają interfejsowi API używanie globalnego systemu pozycjonowania (GPS), Wi-Fi lub danych mobilnych w celu określenia dokładnej lokalizacji, jak to możliwe.
Alternatywnie te uprawnienia można włączyć za pomocą edytora manifestu, aby dodać następujące uprawnienia:
AccessCoarseLocation
AccessFineLocation
Przedstawiono je na poniższym zrzucie ekranu:
Żądanie uprawnień lokalizacji środowiska uruchomieniowego
Jeśli aplikacja jest przeznaczona dla interfejsu API 23 lub nowszego i musi uzyskać dostęp do lokalizacji użytkownika, musi sprawdzić, czy ma wymagane uprawnienie w czasie wykonywania, i zażądać go, jeśli nie ma go. Można to zrobić w następujący sposób:
MainActivity
W klasie dodaj następujące pola:const int RequestLocationId = 0; readonly string[] LocationPermissions = { Manifest.Permission.AccessCoarseLocation, Manifest.Permission.AccessFineLocation };
MainActivity
W klasie dodaj następująceOnStart
przesłonięcia: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. } } }
Pod warunkiem, że aplikacja jest przeznaczona dla interfejsu API 23 lub nowszego, ten kod wykonuje sprawdzanie uprawnień środowiska uruchomieniowego
AccessFineLocation
dla uprawnienia. Jeśli uprawnienie nie zostało przyznane, żądanie uprawnień jest wykonywane przez wywołanieRequestPermissions
metody .MainActivity
W klasie dodaj następująceOnRequestPermissionsResult
przesłonięcia: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); } }
To zastąpienie obsługuje wynik żądania uprawnień.
Ogólny efekt tego kodu polega na tym, że gdy aplikacja żąda lokalizacji użytkownika, zostanie wyświetlone następujące okno dialogowe, które żąda uprawnień:
Platforma uniwersalna systemu Windows
W systemie UWP aplikacja musi zostać uwierzytelniona, zanim będzie mogła wyświetlać mapę i korzystać z usług mapy. Aby uwierzytelnić aplikację, należy określić klucz uwierzytelniania map. Aby uzyskać więcej informacji, zobacz Żądanie klucza uwierzytelniania map. Token uwierzytelniania należy następnie określić w wywołaniu FormsMaps.Init("AUTHORIZATION_TOKEN")
metody, aby uwierzytelnić aplikację za pomocą usługi Mapy Bing.
Uwaga
Aby na platformie UWP używać usług mapowania, takich jak geokodowanie, należy również ustawić MapService.ServiceToken
właściwość na wartość klucza uwierzytelniania. Można to zrobić za pomocą następującego wiersza kodu: Windows.Services.Maps.MapService.ServiceToken = "INSERT_AUTH_TOKEN_HERE";
.
Ponadto jeśli aplikacja musi uzyskać dostęp do lokalizacji użytkownika, musisz włączyć funkcję lokalizacji w manifeście pakietu. Można to zrobić w następujący sposób:
W Eksplorator rozwiązań kliknij dwukrotnie plik package.appxmanifest i wybierz kartę Możliwości.
Na liście Możliwości zaznacz pole wyboru Lokalizacja. Spowoduje to dodanie
location
możliwości urządzenia do pliku manifestu pakietu.<Capabilities> <!-- DeviceCapability elements must follow Capability elements (if present) --> <DeviceCapability Name="location"/> </Capabilities>
Kompilacje wydania
Kompilacje wersji platformy UWP używają natywnej kompilacji platformy .NET do kompilowania aplikacji bezpośrednio do kodu natywnego. Jednak konsekwencją tego jest to, że moduł renderujący dla kontrolki Map
na platformie UWP może być połączony z plikiem wykonywalnym. Można to naprawić za pomocą przeciążenia specyficznego dla platformy UNIWERSALNEJ Forms.Init
systemu Windows metody w App.xaml.cs:
var assembliesToInclude = new [] { typeof(Xamarin.Forms.Maps.UWP.MapRenderer).GetTypeInfo().Assembly };
Xamarin.Forms.Forms.Init(e, assembliesToInclude);
Ten kod przekazuje zestaw, w którym Xamarin.Forms.Maps.UWP.MapRenderer
znajduje się klasa, do Forms.Init
metody . Gwarantuje to, że zestaw nie jest połączony z plikiem wykonywalny przez proces kompilacji natywnej platformy .NET.
Ważne
Wykonanie tej czynności spowoduje, że kontrolka Map
nie będzie wyświetlana podczas uruchamiania kompilacji wydania.