Xamarin.Forms 맵 초기화 및 구성

컨트롤은 Map 각 플랫폼에서 네이티브 맵 컨트롤을 사용합니다. 이는 사용자에게 빠르고 친숙한 맵 환경을 제공하지만 각 플랫폼 API 요구 사항을 준수하기 위해 일부 구성 단계가 필요하다는 것을 의미합니다.

지도 초기화

Map.지도 컨트롤이 Xamarin.Forms제공됩니다. 솔루션의 모든 프로젝트에 추가해야 하는 NuGet 패키지입니다.

.지도 설치 Xamarin.Forms후 NuGet 패키지는 각 플랫폼 프로젝트에서 초기화되어야 합니다.

iOS에서는 메서드 뒤 Xamarin.Forms.Forms.Init메서드를 호출하여 Xamarin.FormsMaps.Init AppDelegate.cs 발생합니다.

Xamarin.FormsMaps.Init();

Android에서는 메서드 뒤 Xamarin.Forms.Forms.Init메서드를 호출하여 Xamarin.FormsMaps.Init MainActivity.cs 발생합니다.

Xamarin.FormsMaps.Init(this, savedInstanceState);

유니버설 Windows 플랫폼(UWP)에서는 생성자에서 MainPage 메서드를 호출하여 Xamarin.FormsMaps.Init MainPage.xaml.cs 발생합니다.

Xamarin.FormsMaps.Init("INSERT_AUTHENTICATION_TOKEN_HERE");

UWP에 필요한 인증 토큰에 대한 자세한 내용은 유니버설 Windows 플랫폼 참조하세요.

NuGet 패키지가 추가되고 각 애플리케이션 Xamarin.Forms.Maps 내에서 호출되는 초기화 메서드가 추가되면 공유 코드 프로젝트에서 API를 사용할 수 있습니다.

플랫폼 구성

지도가 표시되기 전에 Android 및 UWP(유니버설 Windows 플랫폼)에서 추가 구성이 필요합니다. 또한 iOS, Android 및 UWP에서 사용자의 위치에 액세스하려면 애플리케이션에 위치 권한이 부여되어야 합니다.

iOS

iOS에서 지도를 표시하고 상호 작용해도 추가 구성이 필요하지 않습니다. 그러나 위치 서비스에 액세스하려면 Info.plist에서 다음 키를 설정해야 합니다.

iOS 11 이하를 지원하려면 세 가지 키 NSLocationWhenInUseUsageDescription( , NSLocationAlwaysAndWhenInUseUsageDescriptionNSLocationAlwaysUsageDescription)를 모두 포함할 수 있습니다.

Info.plist에서 이러한 키에 대한 XML 표현은 다음과 같습니다. 애플리케이션에서 string 위치 정보를 사용하는 방식을 반영하도록 값을 업데이트해야 합니다.

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

Info.plist 파일을 편집하는 동안 원본 보기에서 Info.plist 항목을 추가할 수도 있습니다.

iOS 8용 Info.plist

그러면 애플리케이션이 사용자의 위치에 액세스하려고 할 때 액세스 권한을 요청하는 프롬프트가 표시됩니다.

iOS의 위치 권한 요청 스크린샷

Android

Android에서 지도를 표시하고 상호 작용하기 위한 구성 프로세스는 다음과 같습니다.

  1. Google 지도 API 키를 가져와 매니페스트에 추가합니다.
  2. 매니페스트에서 Google Play 서비스 버전 번호를 지정합니다.
  3. 매니페스트에서 Apache HTTP 레거시 라이브러리에 대한 요구 사항을 지정합니다.
  4. [선택 사항] 매니페스트에서 WRITE_EXTERNAL_STORAGE 권한을 지정합니다.
  5. [선택 사항] 매니페스트에서 위치 권한을 지정합니다.
  6. [선택 사항] 클래스에서 MainActivity 런타임 위치 권한을 요청합니다.

올바르게 구성된 매니페스트 파일의 예제는 샘플 애플리케이션의 AndroidManifest.xml 참조하세요.

Google 지도 API 키 가져오기

Android에서 Google 지도 API를 사용하려면 API 키를 생성해야 합니다. 이렇게 하려면 Google 지도 API 키 가져오기의 지침을 따릅니다.

API 키를 가져온 후에는 Properties/AndroidManifest.xml 파일의 요소 내에 <application> 추가해야 합니다.

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

그러면 API 키가 매니페스트에 포함됩니다. 유효한 API 키가 없으면 컨트롤에 Map 빈 표가 표시됩니다.

참고 항목

com.google.android.geo.API_KEY 는 API 키에 권장되는 메타데이터 이름입니다. 이전 버전과의 호환성을 com.google.android.maps.v2.API_KEY 위해 메타데이터 이름을 사용할 수 있지만 Android 지도 API v2에 대한 인증만 허용합니다.

APK가 Google 지도 액세스하려면 APK에 서명하는 데 사용하는 모든 키 저장소(디버그 및 릴리스)에 대한 SHA-1 지문 및 패키지 이름을 포함해야 합니다. 예를 들어 디버그용으로 하나의 컴퓨터를 사용하고 릴리스 APK를 생성하기 위해 다른 컴퓨터를 사용할 경우, 첫 번째 컴퓨터의 디버그 키 저장소에서 가져온 SHA-1 인증서 지문과 두 번째 컴퓨터의 릴리스 키 저장소에서 가져온 SHA-1 인증서 지문을 포함해야 합니다. 또한 앱의 패키지 이름이 변경되는 경우 키 자격 증명을 편집해야 합니다. Google 지도 API 키 가져오기를 참조하세요.

Google Play 서비스 버전 번호 지정

AndroidManifest.xml 요소 내에 다음 선언을 <application> 추가합니다.

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

이렇게 하면 애플리케이션이 컴파일된 Google Play 서비스 버전이 매니페스트에 포함됩니다.

Apache HTTP 레거시 라이브러리에 대한 요구 사항 지정

Xamarin.Forms 애플리케이션이 API 28 이상을 대상으로 하는 경우 AndroidManifest.xml 요소 내에 다음 선언을 <application> 추가해야 합니다.

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

그러면 Android 9에서 제거된 Apache Http 클라이언트 라이브러리를 사용하도록 애플리케이션에 bootclasspath 지시합니다.

WRITE_EXTERNAL_STORAGE 권한 지정

애플리케이션이 API 22 이하를 대상으로 하는 경우 매니페스트에 권한을 요소의 <manifest> 자식으로 추가 WRITE_EXTERNAL_STORAGE 해야 할 수 있습니다.

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

애플리케이션이 API 23을 대상으로 하는 경우에는 필요하지 않습니다.

위치 권한 지정

애플리케이션이 사용자의 위치에 액세스해야 하는 경우 매니페스트(또는 둘 다)에 요소의 <manifest> 자식으로 사용 ACCESS_FINE_LOCATION 권한을 추가하여 ACCESS_COARSE_LOCATION 권한을 요청해야 합니다.

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

이 권한을 통해 API는 ACCESS_COARSE_LOCATION WiFi 또는 모바일 데이터 또는 둘 다를 사용하여 디바이스의 위치를 확인할 수 있습니다. 이 권한을 통해 API는 ACCESS_FINE_LOCATION GPS(Global Positioning System), WiFi 또는 모바일 데이터를 사용하여 가능한 한 정확한 위치를 결정할 수 있습니다.

또는 매니페스트 편집기를 사용하여 다음 권한을 추가하여 이러한 권한을 사용하도록 설정할 수 있습니다.

  • AccessCoarseLocation
  • AccessFineLocation

아래 스크린샷에 나와 있습니다.

Android에 필요한 권한

런타임 위치 권한 요청

애플리케이션이 API 23 이상을 대상으로 하고 사용자의 위치에 액세스해야 하는 경우 검사 런타임에 필요한 권한이 있는지 확인하고, 권한이 없는 경우 요청해야 합니다. 이렇게 하려면 다음을 수행합니다.

  1. 클래스에서 MainActivity 다음 필드를 추가합니다.

    const int RequestLocationId = 0;
    
    readonly string[] LocationPermissions =
    {
        Manifest.Permission.AccessCoarseLocation,
        Manifest.Permission.AccessFineLocation
    };
    
  2. 클래스에서 MainActivity 다음 재정의를 추가합니다 OnStart .

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

    애플리케이션이 API 23을 대상으로 하는 경우 이 코드는 권한에 대한 AccessFineLocation 런타임 권한 검사 수행합니다. 사용 권한이 부여되지 않은 경우 메서드를 호출 RequestPermissions 하여 사용 권한 요청을 만듭니다.

  3. 클래스에서 MainActivity 다음 재정의를 추가합니다 OnRequestPermissionsResult .

    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);
        }
    }
    

    이 재정의는 권한 요청의 결과를 처리합니다.

이 코드의 전반적인 효과는 애플리케이션이 사용자의 위치를 요청할 때 권한을 요청하는 다음 대화 상자가 표시된다는 것입니다.

Android의 위치 권한 요청 스크린샷

유니버설 Windows 플랫폼

UWP에서는 맵을 표시하고 지도 서비스를 사용하려면 먼저 애플리케이션을 인증해야 합니다. 애플리케이션을 인증하려면 지도 인증 키를 지정해야 합니다. 자세한 내용은 지도 인증 키 요청을 참조 하세요. 그런 다음 Bing 지도 사용하여 애플리케이션을 인증하기 위해 메서드 호출에서 FormsMaps.Init("AUTHORIZATION_TOKEN") 인증 토큰을 지정해야 합니다.

참고 항목

UWP에서 지오코딩과 같은 맵 서비스를 사용하려면 속성도 인증 키 값으로 설정 MapService.ServiceToken 해야 합니다. 이 작업은 다음 코드 Windows.Services.Maps.MapService.ServiceToken = "INSERT_AUTH_TOKEN_HERE";줄로 수행할 수 있습니다.

또한 애플리케이션이 사용자의 위치에 액세스해야 하는 경우 패키지 매니페스트에서 위치 기능을 사용하도록 설정해야 합니다. 이렇게 하려면 다음을 수행합니다.

  1. 솔루션 탐색기에서 package.appxmanifest를 두 번 클릭하고 기능 탭을 선택하세요.

  2. 기능 목록에서 위치 상자를 선택합니다. 그러면 패키지 매니페스트 파일에 디바이스 기능이 추가 location 됩니다.

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

릴리스 빌드

UWP 릴리스 빌드는 .NET 네이티브 컴파일을 사용하여 애플리케이션을 네이티브 코드로 직접 컴파일합니다. 그러나 결과적으로 UWP의 컨트롤에 대한 Map 렌더러가 실행 파일에서 연결될 수 있습니다. 이 문제는 App.xaml.cs 메서드의 UWP별 오버로드를 Forms.Init사용하여 해결할 수 있습니다.

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

이 코드는 클래스가 있는 어셈블리를 Xamarin.Forms.Maps.UWP.MapRenderer 메서드에 Forms.Init 전달합니다. 이렇게 하면 .NET 네이티브 컴파일 프로세스에서 어셈블리가 실행 파일에서 연결되지 않습니다.

Important

이렇게 하지 않으면 릴리스 빌드를 Map 실행할 때 컨트롤이 표시되지 않습니다.