in maplibre-native-ios/Amazon Location Service Demo/AWSSignatureV4Delegate.swift [19:59]
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!,
keyPath: 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 {
// have MapLibre fetch the signed URL
return result as URL
}
// fall back to an unsigned URL
return url
}