La migración del SDK de Places para iOS al SDK de Places Swift para iOS (versión preliminar) debería ser sencilla y se puede realizar de forma incremental. Dado que las estructuras del SDK de Places para Swift para iOS (versión preliminar) no son compatibles con sus contrapartes basadas en Objective-C, te recomendamos que migres fragmentos discretos de funcionalidad según el uso de las APIs en GMSPlacesClient.
Agrega el SDK de Places Swift para iOS (versión preliminar) a tu proyecto
Para usar el SDK de Places para Swift para iOS (versión preliminar), debes seguir estos pasos:
- Habilita la API de Places (versión nueva).
Agrega el SDK de Places para Swift para iOS (versión preliminar) a tus dependencias. Puedes instalar
GooglePlaces
,GooglePlacesSwift
o ambos.Inicializa el cliente de Places con
PlacesClient
.
Ejemplo de migración paso a paso
A modo de ejemplo, supongamos que una app que usa el SDK de Places para iOS recibe sugerencias de autocompletado según una entrada de texto y, luego, recupera los detalles de la primera sugerencia de lugar. Con el SDK de Places para iOS, el código existente podría verse de la siguiente manera:
// Initialize Places Client.
GMSPlacesClient.provideAPIKey(apiKey)
let client = GMSPlacesClient.shared()
// Fetch Autocomplete Request.
let center = CLLocation(latitude: 37.3913916, longitude: -122.0879074)
let northEast = CLLocationCoordinate2DMake(37.388162, -122.088137)
let southWest = CLLocationCoordinate2DMake(37.395804, -122.077023)
let filter = GMSAutocompleteFilter()
filter.types = [kGMSPlaceTypeRestaurant]
filter.origin = center
filter.locationBias = GMSPlaceRectangularLocationOption(northEast, southWest)
let request = GMSAutocompleteRequest(query: "Sicilian piz")
request.filter = filter
client.fetchAutocompleteSuggestions(from: request) { (results, error) in
guard let results, error == nil else {
print("Autocomplete error: \(String(describing: error))")
return
}
// Fetch Place Request.
guard let placeID = results.first?.placeSuggestion?.placeID else { return }
let myProperties = [GMSPlaceProperty.name, GMSPlaceProperty.website].map {$0.rawValue}
let fetchPlaceRequest = GMSFetchPlaceRequest(placeID: placeID, placeProperties: myProperties, sessionToken: nil)
client.fetchPlace(with: fetchPlaceRequest) { (place: GMSPlace?, error: Error?) in
guard let place, error == nil else { return }
print("Place found: \(String(describing: place.name)); \(String(describing: place.website))")
}
}
Actualiza el inicializador del cliente de Places
Para modernizar el código y aprovechar las funciones del nuevo SDK, deberás reemplazar GMSPlacesClient por PlacesClient. Además, los nombres de los parámetros cambian en el método nuevo, por lo que deberás actualizar el parámetro a from
en lugar de with
. Por último, el SDK de Places para Swift para iOS (versión preliminar) usa la AutocompleteRequest actualizada.
Código actualizado
// Initialize Places Swift Client.
let _ = PlacesClient.provideAPIKey(apiKey)
let placesSwiftClient = PlacesClient.shared
Código original
// Initialize Places Client.
GMSPlacesClient.provideAPIKey(apiKey)
let client = GMSPlacesClient.shared()
Actualiza la solicitud de Autocomplete
Puedes comenzar por actualizar el flujo de solicitudes de autocompletado. El código anterior usa una callback para solicitar sugerencias de autocompletado, mientras que el código nuevo emplea un patrón switch
/await
. Las devoluciones de llamada pueden agregar complejidad a la estructura del código y a la administración de errores. El nuevo SDK de Places para Swift para iOS (versión preliminar) admite la simultaneidad, lo que simplifica las operaciones asíncronas.
// Initialize Places Swift Client.
let _ = PlacesClient.provideAPIKey(apiKey)
let placesSwiftClient = PlacesClient.shared
// Fetch Autocomplete Request.
let center = CLLocation(latitude: 37.3913916, longitude: -122.0879074)
let northEast = CLLocationCoordinate2DMake(37.388162, -122.088137)
let southWest = CLLocationCoordinate2DMake(37.395804, -122.077023)
let bias = RectangularCoordinateRegion(northEast: northEast, southWest: southWest)
let filter = AutocompleteFilter(types: [ .restaurant ], origin: center, coordinateRegionBias: bias)
let autocompleteRequest = AutocompleteRequest(query: "Sicilian piz", filter: filter)
let placeID: String
switch await placesSwiftClient.fetchAutocompleteSuggestions(with: autocompleteRequest) {
case .success(let results):
switch results.first {
case .place(let placeSuggestion):
placeID = placeSuggestion.placeID
case .none:
fallthrough
@unknown default:
return
}
case .failure(let placesError):
print("Autocomplete error: \(placesError)")
return
}
// Initialize Places Client.
GMSPlacesClient.provideAPIKey(apiKey)
let placesClient = GMSPlacesClient.shared()
// Fetch Place Request.
let myProperties = [GMSPlaceProperty.name, GMSPlaceProperty.website].map {$0.rawValue}
let fetchPlaceRequest = GMSFetchPlaceRequest(placeID: placeID, placeProperties: myProperties, sessionToken: nil)
placesClient.fetchPlace(with: fetchPlaceRequest) { (place: GMSPlace?, error: Error?) in
guard let place, error == nil else { return }
print("Place found: \(String(describing: place.name)); \(String(describing: place.website))")
}
Actualiza los nombres de métodos y clases
Por último, completa la migración refactorizando el código fetchPlace
y quitando la inicialización GMSPlacesClient
y la declaración GMSPlaceProperty
. En el SDK de Places Swift para iOS (versión preliminar), se actualizaron el método y los nombres de clase para quitar el prefijo "GMS" y deben actualizarse según corresponda, p.ej., GMSFetchPlaceRequest
se convierte en FetchPlaceRequest
.
Manejo de tipos
El nuevo método fetchPlace
usa un control de tipos mejorado. Si bien el código anterior requiere pasar los valores sin procesar de la propiedad, el código nuevo no requiere que los desarrolladores recuperen valores sin procesar de forma explícita aquí, lo que mejora la concisión y la legibilidad.
Simultaneidad
Además, el nuevo método admite la simultaneidad, lo que permite reemplazar la devolución de llamada en placesClient.fetchPlace
por un patrón switch
/await
en placesSwiftClient.fetchPlace
.
// Initialize Places Swift Client.
let _ = PlacesClient.provideAPIKey(apiKey)
let placesSwiftClient = PlacesClient.shared
// Fetch Autocomplete Request.
let center = CLLocation(latitude: 37.3913916, longitude: -122.0879074)
let northEast = CLLocationCoordinate2DMake(37.388162, -122.088137)
let southWest = CLLocationCoordinate2DMake(37.395804, -122.077023)
let bias = RectangularCoordinateRegion(northEast: northEast, southWest: southWest)
let filter = AutocompleteFilter(types: [ .restaurant ], origin: center, coordinateRegionBias: bias)
let autocompleteRequest = AutocompleteRequest(query: "Sicilian piz", filter: filter)
let placeID: String
switch await placesSwiftClient.fetchAutocompleteSuggestions(with: autocompleteRequest) {
case .success(let results):
switch results.first {
case .place(let placeSuggestion):
placeID = placeSuggestion.placeID
case .none:
fallthrough
@unknown default:
return
}
case .failure(let placesError):
print("Autocomplete error: \(placesError)")
return
}
// Fetch Place Request.
let fetchPlaceRequest = FetchPlaceRequest(placeID: placeID, placeProperties: [.displayName, .websiteURL])
switch await placesSwiftClient.fetchPlace(with: fetchPlaceRequest) {
case .success(let place):
print("Place found: \(place.displayName): \(String(describing: place.description))")
case .failure(let placesError):
print("Place not found: \(placeID); \(placesError)")
}
Mantenerte al tanto
Visita la página de notas de la versión del SDK de Places Swift para iOS (versión preliminar) para obtener información sobre las funciones y los cambios nuevos.