Utilizzo di MapLibre Native SDK per iOS con Amazon Location Service - Servizio di posizione Amazon

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Utilizzo di MapLibre Native SDK per iOS con Amazon Location Service

Usa MapLibreNative SDK for iOS per incorporare mappe lato client nelle applicazioni iOS.

MapLibre Native SDK for iOS è una libreria basata su Mapbox GL Native ed è compatibile con gli stili e i riquadri forniti da Amazon Location Service Maps. API Puoi integrare MapLibre Native SDK for iOS per incorporare visualizzazioni di mappe interattive con mappe vettoriali scalabili e personalizzabili nelle tue applicazioni iOS.

Questo tutorial descrive come integrare MapLibre Native SDK for iOS con Amazon Location. L'applicazione di esempio per questo tutorial è disponibile come parte dell'archivio di esempi di Amazon Location Service su GitHub.

Creazione dell'applicazione: inizializzazione

Per inizializzare l'applicazione:

  1. Crea un nuovo progetto Xcode dal modello dell'app.

  2. Seleziona SwiftUI per la sua interfaccia.

  3. Seleziona l'applicazione SwiftUI per il suo ciclo di vita.

  4. Seleziona Swift come lingua.

Aggiungere MapLibre dipendenze utilizzando i pacchetti Swift

Per aggiungere una dipendenza dal pacchetto al tuo progetto Xcode:

  1. Passa a File > Pacchetti Swift > Aggiungi dipendenza dal pacchetto.

  2. Entra nel repository: URL https://github.com/maplibre/maplibre-gl-native-distribution

    Nota

    Per ulteriori informazioni sui pacchetti Swift, consulta Adding Package Dependencies to Your App su Apple.com

  3. Nel tuo terminale, installa: CocoaPods

    sudo gem install cocoapods
  4. Vai alla directory del progetto dell'applicazione e inizializza il Podfile con il gestore di CocoaPods pacchetti:

    pod init
  5. Apri il Podfile da aggiungere AWSCore come dipendenza:

    platform :ios, '12.0' target 'Amazon Location Service Demo' do use_frameworks! pod 'AWSCore' end
  6. Scarica e installa le dipendenze:

    pod install --repo-update
  7. Apri lo spazio di lavoro Xcode che ha creato: CocoaPods

    xed .

Creazione dell'applicazione: configurazione

Aggiungi le seguenti chiavi e valori a Info.plist per configurare l'applicazione:

Chiave Valore
AWSRegion us-east-1
IdentityPoolId us-east- 1:54 f2ba88-9390-498d-aaa5-0d97fb7ca3bd
MapName ExampleMap

Creazione dell'applicazione: layout ContentView

Per renderizzare la mappa, modificaContentView.swift:

  • Aggiungi un file MapView che renderizza la mappa.

  • Aggiungi un TextField che mostra l'attribuzione.

Questo imposta anche il punto centrale iniziale della mappa.

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() } }
Nota

È necessario fornire un marchio denominativo o un'attribuzione di testo per ogni fornitore di dati che si utilizza, nell'applicazione o nella documentazione. Le stringhe di attribuzione sono incluse nella risposta del descrittore di stile sotto i tastisources.esri.attribution, sources.here.attribution e. source.grabmaptiles.attribution Quando utilizzi le risorse di Amazon Location con fornitori di dati, assicurati di leggere i termini e le condizioni del servizio.

Creazione dell'applicazione: richiedi la trasformazione

Crea un nuovo file Swift denominato AWSSignatureV4Delegate.swift contenente la seguente definizione di classe per intercettare AWS le richieste e firmarle utilizzando Signature Version 4. Un'istanza di questa classe verrà assegnata come delegata all'archiviazione offline, che è anche responsabile della riscritturaURLs, nella visualizzazione della mappa.

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

Creazione dell'applicazione: visualizzazione della mappa

Map View è responsabile dell'inizializzazione AWSSignatureV4Delegate e della configurazione di un'istanza di quella sottostanteMGLMapView, che recupera le risorse e rende la mappa. Gestisce inoltre la propagazione delle stringhe di attribuzione dalla fonte del descrittore di stile al. ContentView

Crea un nuovo file Swift denominato MapView.swift contenente la seguente definizione: 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 } }

L'esecuzione di questa applicazione mostra una mappa a schermo intero nello stile che preferisci. Questo esempio è disponibile come parte dell'archivio di esempi di Amazon Location Service su GitHub.