Uso de la versión MapLibre nativa SDK para iOS con Amazon Location Service - Amazon Location Service

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 incrustar mapas del lado del cliente en las aplicaciones de iOS.

The MapLibre Native SDK para iOS es una biblioteca basada en Mapbox GL Native y es compatible con los estilos y mosaicos proporcionados por Amazon Location Service MapsAPI. Puedes integrar MapLibre Native SDK para iOS para integrar vistas de mapas interactivas con mapas vectoriales escalables y personalizables en tus aplicaciones iOS.

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:

  1. Crear un nuevo proyecto Xcode a partir de la plantilla App.

  2. Seleccione SwiftUI para su interfaz.

  3. Seleccione la aplicación SwiftUI para su ciclo de vida.

  4. Seleccione Swift como su idioma.

Añadir MapLibre dependencias mediante Swift Packages

Para agregar una dependencia de paquete a su proyecto de Xcode:

  1. Vaya a Archivo > Paquetes Swift > Agregar dependencia de un paquete.

  2. 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

  3. En tu terminal, instala CocoaPods:

    sudo gem install cocoapods
  4. Navega hasta el directorio de proyectos de tu aplicación e inicializa el Podfile con el administrador de CocoaPods paquetes:

    pod init
  5. Abra el Podfile para agregar AWSCore como dependencia:

    platform :ios, '12.0' target 'Amazon Location Service Demo' do use_frameworks! pod 'AWSCore' end
  6. Descarga e instalación de dependencias:

    pod install --repo-update
  7. 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 structsiguiente 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.