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
MapLibre Native SDK for iOS è una libreria basata su Mapbox GL Native
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:
-
Crea un nuovo progetto Xcode dal modello dell'app.
-
Seleziona SwiftUI per la sua interfaccia.
-
Seleziona l'applicazione SwiftUI per il suo ciclo di vita.
-
Seleziona Swift come lingua.
Aggiungere MapLibre dipendenze utilizzando i pacchetti Swift
Per aggiungere una dipendenza dal pacchetto al tuo progetto Xcode:
-
Passa a File > Pacchetti Swift > Aggiungi dipendenza dal pacchetto.
-
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 -
Nel tuo terminale, installa: CocoaPods
sudo gem install cocoapods
-
Vai alla directory del progetto dell'applicazione e inizializza il Podfile con il gestore di CocoaPods pacchetti:
pod init
-
Apri il Podfile da aggiungere
AWSCore
come dipendenza:platform :ios, '12.0' target 'Amazon Location Service Demo' do use_frameworks! pod 'AWSCore' end
-
Scarica e installa le dipendenze:
pod install --repo-update
-
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