Verwenden von The MapLibre Native SDK für iOS mit Amazon Location Service - Amazon Location Service

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Verwenden von The MapLibre Native SDK für iOS mit Amazon Location Service

Verwenden Sie MapLibreNative SDK für iOS, um clientseitige Karten in iOS-Anwendungen einzubetten.

The MapLibre Native SDK for iOS ist eine Bibliothek, die auf Mapbox GL Native basiert und mit den Stilen und Kacheln kompatibel ist, die von Amazon Location Service Maps API bereitgestellt werden. Sie können MapLibre Native SDK for iOS integrieren, um interaktive Kartenansichten mit skalierbaren, anpassbaren Vektorkarten in Ihre iOS-Anwendungen einzubetten.

In diesem Tutorial wird beschrieben, wie Sie MapLibre Native SDK für iOS mit Amazon Location integrieren. Die Beispielanwendung für dieses Tutorial ist als Teil des Amazon Location Service Samples Repository unter verfügbar GitHub.

Erstellung der Anwendung: Initialisierung

Um Ihre Anwendung zu initialisieren:

  1. Erstellen Sie ein neues Xcode-Projekt aus der App-Vorlage.

  2. Wählen Sie SwiftUI als Benutzeroberfläche aus.

  3. Wählen Sie die SwiftUI-Anwendung für ihren Lebenszyklus aus.

  4. Wählen Sie Swift als Sprache aus.

Hinzufügen von MapLibre Abhängigkeiten mithilfe von Swift-Paketen

So fügen Sie Ihrem Xcode-Projekt eine Paketabhängigkeit hinzu:

  1. Navigieren Sie zu Datei > Swift-Pakete > Paketabhängigkeit hinzufügen.

  2. Geben Sie das Repository einURL: https://github.com/maplibre/maplibre-gl-native-distribution

    Anmerkung

    Weitere Informationen zu Swift-Paketen findest du unter Hinzufügen von Paketabhängigkeiten zu deiner App auf Apple.com

  3. Installieren Sie in Ihrem Terminal: CocoaPods

    sudo gem install cocoapods
  4. Navigieren Sie zum Projektverzeichnis Ihrer Anwendung und initialisieren Sie das Podfile mit dem CocoaPods Paketmanager:

    pod init
  5. Öffnen Sie die Poddatei, die Sie AWSCore als Abhängigkeit hinzufügen möchten:

    platform :ios, '12.0' target 'Amazon Location Service Demo' do use_frameworks! pod 'AWSCore' end
  6. Laden Sie Abhängigkeiten herunter und installieren Sie sie:

    pod install --repo-update
  7. Öffnen Sie den Xcode-Arbeitsbereich, der Folgendes CocoaPods erstellt hat:

    xed .

Die Anwendung erstellen: Konfiguration

Fügen Sie die folgenden Schlüssel und Werte zu Info.plist hinzu, um die Anwendung zu konfigurieren:

Schlüssel Wert
AWSRegion us-east-1
IdentityPoolId US-Ost- 1:54 f2ba88-9390-498d-aaa5-0d97fb7ca3bd
MapName ExampleMap

Erstellung der Anwendung: Layout ContentView

Um die Karte zu rendern, bearbeiten SieContentView.swift:

  • Fügen Sie eine hinzuMapView, die die Karte rendert.

  • Fügen Sie eine hinzuTextField, die die Zuordnung anzeigt.

Dadurch wird auch der ursprüngliche Mittelpunkt der Karte festgelegt.

import SwiftUI struct ContentView: View { @State private var attribution = "" var body: some View { MapView(attribution: $attribution) .centerCoordinate(.init(latitude: 49.2819, longitude: -123.1187)) .zoomLevel(12) .edgesIgnoringSafeArea(.all) .overlay( TextField("", text: $attribution) .disabled(true) .font(.system(size: 12, weight: .light, design: .default)) .foregroundColor(.black) .background(Color.init(Color.RGBColorSpace.sRGB, white: 0.5, opacity: 0.5)) .cornerRadius(1), alignment: .bottomTrailing) } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
Anmerkung

Sie müssen für jeden Datenanbieter, den Sie verwenden, entweder in Ihrer Anwendung oder in Ihrer Dokumentation eine Wortmarke oder eine Textzuweisung angeben. Zuordnungszeichenfolgen sind in der Antwort auf den Stildeskriptor unter den Tasten sources.esri.attributionsources.here.attribution, und enthalten. source.grabmaptiles.attribution Wenn Sie Amazon-Standortressourcen mit Datenanbietern verwenden, lesen Sie unbedingt die Servicebedingungen.

Erstellung der Anwendung: Transformation anfordern

Erstellen Sie eine neue Swift-Datei AWSSignatureV4Delegate.swift mit dem Namen, die die folgende Klassendefinition enthält, um AWS Anfragen abzufangen und sie mit Signature Version 4 zu signieren. Eine Instanz dieser Klasse wird in der Kartenansicht als Offline-Speicherdelegierter zugewiesen, der auch für das Umschreiben URLs zuständig ist.

import AWSCore import Mapbox class AWSSignatureV4Delegate : NSObject, MGLOfflineStorageDelegate { private let region: AWSRegionType private let identityPoolId: String private let credentialsProvider: AWSCredentialsProvider init(region: AWSRegionType, identityPoolId: String) { self.region = region self.identityPoolId = identityPoolId self.credentialsProvider = AWSCognitoCredentialsProvider(regionType: region, identityPoolId: identityPoolId) super.init() } class func doubleEncode(path: String) -> String? { return path.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed)? .addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) } func offlineStorage(_ storage: MGLOfflineStorage, urlForResourceOf kind: MGLResourceKind, with url: URL) -> URL { if url.host?.contains("amazonaws.com") != true { // not an AWS URL return url } // URL-encode spaces, etc. let keyPath = String(url.path.dropFirst()) guard let percentEncodedKeyPath = keyPath.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) else { print("Invalid characters in path '\(keyPath)'; unsafe to sign") return url } let endpoint = AWSEndpoint(region: region, serviceName: "geo", url: url) let requestHeaders: [String: String] = ["host": endpoint!.hostName] // sign the URL let task = AWSSignatureV4Signer .generateQueryStringForSignatureV4( withCredentialProvider: credentialsProvider, httpMethod: .GET, expireDuration: 60, endpoint: endpoint!, // workaround for https://github.com/aws-amplify/aws-sdk-ios/issues/3215 keyPath: AWSSignatureV4Delegate.doubleEncode(path: percentEncodedKeyPath), requestHeaders: requestHeaders, requestParameters: .none, signBody: true) task.waitUntilFinished() if let error = task.error as NSError? { print("Error occurred: \(error)") } if let result = task.result { var urlComponents = URLComponents(url: (result as URL), resolvingAgainstBaseURL: false)! // re-use the original path; workaround for https://github.com/aws-amplify/aws-sdk-ios/issues/3215 urlComponents.path = url.path // have Mapbox GL fetch the signed URL return (urlComponents.url)! } // fall back to an unsigned URL return url } }

Erstellung der Anwendung: Kartenansicht

Die Kartenansicht ist verantwortlich für die Initialisierung einer Instanz AWSSignatureV4Delegate und die Konfiguration der zugrunde liegenden InstanzMGLMapView, die Ressourcen abruft und die Map rendert. Es kümmert sich auch um die Weitergabe von Attributionszeichenfolgen von der Quelle des Stildeskriptors zurück an die. ContentView

Erstellen Sie eine neue Swift-Datei MapView.swift mit dem Namen, die die folgende Definition enthält: struct

import SwiftUI import AWSCore import Mapbox struct MapView: UIViewRepresentable { @Binding var attribution: String private var mapView: MGLMapView private var signingDelegate: MGLOfflineStorageDelegate init(attribution: Binding<String>) { let regionName = Bundle.main.object(forInfoDictionaryKey: "AWSRegion") as! String let identityPoolId = Bundle.main.object(forInfoDictionaryKey: "IdentityPoolId") as! String let mapName = Bundle.main.object(forInfoDictionaryKey: "MapName") as! String let region = (regionName as NSString).aws_regionTypeValue() // MGLOfflineStorage doesn't take ownership, so this needs to be a member here signingDelegate = AWSSignatureV4Delegate(region: region, identityPoolId: identityPoolId) // register a delegate that will handle SigV4 signing MGLOfflineStorage.shared.delegate = signingDelegate mapView = MGLMapView( frame: .zero, styleURL: URL(string: "https://maps.geo.\(regionName).amazonaws.com/maps/v0/maps/\(mapName)/style-descriptor")) _attribution = attribution } func makeCoordinator() -> Coordinator { Coordinator($attribution) } class Coordinator: NSObject, MGLMapViewDelegate { var attribution: Binding<String> init(_ attribution: Binding<String>) { self.attribution = attribution } func mapView(_ mapView: MGLMapView, didFinishLoading style: MGLStyle) { let source = style.sources.first as? MGLVectorTileSource let attribution = source?.attributionInfos.first self.attribution.wrappedValue = attribution?.title.string ?? "" } } // MARK: - UIViewRepresentable protocol func makeUIView(context: UIViewRepresentableContext<MapView>) -> MGLMapView { mapView.delegate = context.coordinator mapView.logoView.isHidden = true mapView.attributionButton.isHidden = true return mapView } func updateUIView(_ uiView: MGLMapView, context: UIViewRepresentableContext<MapView>) { } // MARK: - MGLMapView proxy func centerCoordinate(_ centerCoordinate: CLLocationCoordinate2D) -> MapView { mapView.centerCoordinate = centerCoordinate return self } func zoomLevel(_ zoomLevel: Double) -> MapView { mapView.zoomLevel = zoomLevel return self } }

Wenn Sie diese Anwendung ausführen, wird eine Karte im Vollbildmodus im Stil Ihrer Wahl angezeigt. Dieses Beispiel ist als Teil des Amazon Location Service Samples Repository unter verfügbar GitHub.