Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Uso de la versión MapLibre nativa SDK para iOS con Amazon Location Service
Usa MapLibreNative SDK para iOS para
The MapLibre Native SDK para iOS es una biblioteca basada en Mapbox GL Native
En este tutorial se describe cómo integrar MapLibre Native SDK para iOS con Amazon Location. La aplicación de muestra de este tutorial está disponible como parte del repositorio de muestras de Amazon Location Service en GitHub
Creación de la aplicación: inicialización
Para inicializar la aplicación:
-
Crear un nuevo proyecto Xcode a partir de la plantilla App.
-
Seleccione SwiftUI para su interfaz.
-
Seleccione la aplicación SwiftUI para su ciclo de vida.
-
Seleccione Swift como su idioma.
Añadir MapLibre dependencias mediante Swift Packages
Para agregar una dependencia de paquete a su proyecto de Xcode:
-
Vaya a Archivo > Paquetes Swift > Agregar dependencia de un paquete.
-
Ingresa al repositorioURL:
https://github.com/maplibre/maplibre-gl-native-distribution
nota
Para obtener más información sobre Paquetes Swift, consulte Cómo agregar dependencias de paquetes a su aplicación
en Apple.com -
En tu terminal, instala CocoaPods:
sudo gem install cocoapods
-
Navega hasta el directorio de proyectos de tu aplicación e inicializa el Podfile con el administrador de CocoaPods paquetes:
pod init
-
Abra el Podfile para agregar
AWSCore
como dependencia:platform :ios, '12.0' target 'Amazon Location Service Demo' do use_frameworks! pod 'AWSCore' end
-
Descarga e instalación de dependencias:
pod install --repo-update
-
Abre el espacio de trabajo de Xcode que creó: CocoaPods
xed .
Creación de la aplicación: configuración
Agregue las siguientes claves y valores a Info.plist para configurar la aplicación:
Clave | Valor |
---|---|
AWSRegion | us-east-1 |
IdentityPoolId | us-east-1:54f2ba88-9390-498d-aaa5-0d97fb7ca3bd |
MapName | ExampleMap |
Creación de la aplicación: diseño ContentView
Para renderizar el mapa, edite ContentView.swift
:
-
Agregue un
MapView
, que renderice el mapa. -
Agregue un
TextField
, que muestre la atribución.
Esto también establece el punto central inicial del mapa.
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
Debe proporcionar una marca denominativa o una atribución de texto para cada proveedor de datos que utilice, ya sea en su solicitud o en su documentación. Los string de atribución se incluyen en la respuesta del descriptor de estilo, debajo de las claves sources.esri.attribution
, sources.here.attribution
, y source.grabmaptiles.attribution
. Cuando utilice los recursos de Amazon Location con proveedores de datos, asegúrese de leer los términos y condiciones del servicio
Creación de la aplicación: solicite la transformación
Cree un nuevo archivo Swift denominado AWSSignatureV4Delegate.swift
que contenga la siguiente definición de clase para interceptar AWS las solicitudes y firmarlas con Signature Version 4. Se asignará una instancia de esta clase como delegado de almacenamiento sin conexión, que también es responsable de la reescrituraURLs, en la vista de mapa.
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 } }
Creación de la aplicación: vista de mapa
La vista de mapa se encarga de inicializar una instancia AWSSignatureV4Delegate
y configurar la instancia subyacente MGLMapView
, que recupera los recursos y renderiza el mapa. También gestiona la propagación de las cadenas de atribución desde la fuente del descriptor de estilo hasta la ContentView
.
Cree un nuevo archivo Swift denominado MapView.swift
que contenga la struct
siguiente definición:
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 } }
Al ejecutar esta aplicación, se muestra un mapa a pantalla completa con el estilo que elija. Este ejemplo está disponible como parte del repositorio de muestras de Amazon Location Service en GitHub