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
The MapLibre Native SDK for iOS ist eine Bibliothek, die auf Mapbox GL Native
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:
-
Erstellen Sie ein neues Xcode-Projekt aus der App-Vorlage.
-
Wählen Sie SwiftUI als Benutzeroberfläche aus.
-
Wählen Sie die SwiftUI-Anwendung für ihren Lebenszyklus aus.
-
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:
-
Navigieren Sie zu Datei > Swift-Pakete > Paketabhängigkeit hinzufügen.
-
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 -
Installieren Sie in Ihrem Terminal: CocoaPods
sudo gem install cocoapods
-
Navigieren Sie zum Projektverzeichnis Ihrer Anwendung und initialisieren Sie das Podfile mit dem CocoaPods Paketmanager:
pod init
-
Ö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
-
Laden Sie Abhängigkeiten herunter und installieren Sie sie:
pod install --repo-update
-
Ö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 hinzu
MapView
, die die Karte rendert. -
Fügen Sie eine hinzu
TextField
, 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.attribution
sources.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