Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Menggunakan MapLibre Native SDK untuk iOS dengan Amazon Location Service
Gunakan MapLibreNative SDK untuk iOS
MapLibre Native SDK untuk iOS adalah pustaka berdasarkan Mapbox GL Native
Tutorial ini menjelaskan cara mengintegrasikan MapLibre Native SDK untuk iOS dengan Amazon Location. Aplikasi sampel untuk tutorial ini tersedia sebagai bagian dari repositori sampel Amazon Location Service di. GitHub
Membangun aplikasi: Inisialisasi
Untuk menginisialisasi aplikasi Anda:
-
Buat proyek Xcode baru dari template App.
-
Pilih SwiftUI untuk antarmukanya.
-
Pilih aplikasi SwiftUI untuk Siklus Hidupnya.
-
Pilih Swift untuk bahasanya.
Menambahkan MapLibre dependensi menggunakan Paket Swift
Untuk menambahkan ketergantungan paket ke proyek Xcode Anda:
-
Arahkan ke File > Paket Swift > Add Package Dependency.
-
Masukkan repositoriURL:
https://github.com/maplibre/maplibre-gl-native-distribution
catatan
Untuk informasi selengkapnya tentang Paket Swift, lihat Menambahkan Dependensi Paket ke Aplikasi Anda
di Apple.com -
Di terminal Anda, instal CocoaPods:
sudo gem install cocoapods
-
Arahkan ke direktori proyek aplikasi Anda dan inisialisasi Podfile dengan manajer CocoaPods paket:
pod init
-
Buka Podfile untuk ditambahkan
AWSCore
sebagai dependensi:platform :ios, '12.0' target 'Amazon Location Service Demo' do use_frameworks! pod 'AWSCore' end
-
Unduh dan instal dependensi:
pod install --repo-update
-
Buka ruang kerja Xcode yang membuat CocoaPods :
xed .
Membangun aplikasi: Konfigurasi
Tambahkan kunci dan nilai berikut ke Info.plist untuk mengkonfigurasi aplikasi:
Kunci | Nilai |
---|---|
AWSRegion | us-east-1 |
IdentityPoolId | us-timur- 1:54 f2ba88-9390-498d-aaa5-0d97fb7ca3bd |
MapName | ExampleMap |
Membangun aplikasi: ContentView tata letak
Untuk merender peta, editContentView.swift
:
-
Tambahkan
MapView
yang membuat peta. -
Tambahkan
TextField
yang menampilkan atribusi.
Ini juga menetapkan titik pusat awal peta.
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() } }
catatan
Anda harus memberikan tanda kata atau atribusi teks untuk setiap penyedia data yang Anda gunakan, baik pada aplikasi atau dokumentasi Anda. String atribusi disertakan dalam respons deskriptor gaya di bawahsources.esri.attribution
,sources.here.attribution
, dan kunci. source.grabmaptiles.attribution
Saat menggunakan sumber daya Lokasi Amazon dengan penyedia data, pastikan untuk membaca syarat dan ketentuan layanan
Membangun aplikasi: Minta transformasi
Buat file Swift baru bernama AWSSignatureV4Delegate.swift
berisi definisi kelas berikut untuk mencegat AWS permintaan dan menandatanganinya menggunakan Signature Version 4. Sebuah instance dari kelas ini akan ditetapkan sebagai delegasi penyimpanan offline, yang juga bertanggung jawab untuk menulis ulangURLs, dalam tampilan peta.
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 } }
Membangun aplikasi: Tampilan peta
Tampilan Peta bertanggung jawab untuk menginisialisasi instance AWSSignatureV4Delegate
dan mengonfigurasi yang mendasarinyaMGLMapView
, yang mengambil sumber daya dan merender peta. Ini juga menangani penyebaran string atribusi dari sumber deskriptor gaya kembali ke. ContentView
Buat file Swift baru bernama MapView.swift
berisi struct
definisi berikut:
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 } }
Menjalankan aplikasi ini menampilkan peta layar penuh dengan gaya yang Anda pilih. Sampel ini tersedia sebagai bagian dari repositori sampel Amazon Location Service di. GitHub