Udostępnij za pośrednictwem


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 Xamarin.FormsMapy Pakiet NuGet, który powinien zostać dodany do każdego projektu w rozwiązaniu.

Po zainstalowaniu Xamarin.Formspliku .Mapy Pakiet NuGet 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:

Aby obsługiwać system iOS 11 i starsze, możesz uwzględnić wszystkie trzy klucze: NSLocationWhenInUseUsageDescription, NSLocationAlwaysAndWhenInUseUsageDescriptioni 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:

Info.plist dla systemu iOS 8

Monit jest następnie wyświetlany, gdy aplikacja próbuje uzyskać dostęp do lokalizacji użytkownika, żądając dostępu:

Zrzut ekranu przedstawiający żądanie uprawnień lokalizacji w systemie iOS

Android

Proces konfiguracji do wyświetlania mapy w systemie Android i interakcji z nią to:

  1. Pobierz klucz interfejsu API Mapy Google i dodaj go do manifestu.
  2. Określ numer wersji usług Google Play w manifeście.
  3. Określ wymaganie dotyczące starszej biblioteki apache HTTP w manifeście.
  4. [opcjonalnie] Określ uprawnienie WRITE_EXTERNAL_STORAGE w manifeście.
  5. [opcjonalnie] Określ uprawnienia lokalizacji w manifeście.
  6. [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 Mapy

Aby użyć interfejsu API Mapy Google 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 Mapy.

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. W przypadku zgodności z com.google.android.maps.v2.API_KEY poprzednimi wersjami można użyć nazwy metadanych, ale umożliwia uwierzytelnianie tylko interfejsowi API Mapy systemu Android w wersji 2.

Aby plik APK uzyskiwał dostęp do Mapy Google, należy dołączyć odciski palców SHA-1 i nazwy pakietów dla każdego magazynu kluczy (debugowanie i wydawanie), 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 Mapy.

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:

Wymagane uprawnienia dla systemu Android

Żą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:

  1. MainActivity W klasie dodaj następujące pola:

    const int RequestLocationId = 0;
    
    readonly string[] LocationPermissions =
    {
        Manifest.Permission.AccessCoarseLocation,
        Manifest.Permission.AccessFineLocation
    };
    
  2. MainActivity W klasie dodaj następujące OnStart 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łanie RequestPermissions metody .

  3. MainActivity W klasie dodaj następujące OnRequestPermissionsResult 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ń:

Zrzut ekranu przedstawiający żądanie uprawnień lokalizacji w systemie Android

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 Bing Mapy.

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:

  1. W Eksplorator rozwiązań kliknij dwukrotnie plik package.appxmanifest i wybierz kartę Możliwości.

  2. 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.