Migra al SDK de Places Swift para iOS (versión preliminar)

Migración del SDK de Places para iOS a El SDK de Places Swift para iOS (versión preliminar) debe ser sencillo y se puede realizar. de forma incremental. Debido a que las structs del SDK de Places Swift para iOS (versión preliminar) no son con sus contrapartes basadas en Objective-C, recomendamos fragmentos discretos de funcionalidad basados en los usos de APIs en GMSPlacesClient.

Agrega el SDK de Places para Swift para iOS (versión preliminar) a tu proyecto

Los siguientes pasos son obligatorios para usar el SDK de Places Swift para iOS (versión preliminar):

  1. Habilitar la API de Places (Nuevo).
  2. Agrega el SDK de Places Swift para iOS (versión preliminar) a tus dependencias.
  3. Inicializa el cliente de Places con PlacesClient

Ejemplo de migración paso a paso

A modo de ejemplo, supongamos que una aplicación usa el SDK de Places para iOS recibe sugerencias de autocompletar basadas en una entrada de texto y, luego, recupera la los detalles de la sugerencia de primer 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, se debe reemplazar GMSPlacesClient por PlacesClient. Además, el los nombres de los parámetros se cambian en el nuevo método, por lo que deberás actualizar parámetro a from en lugar de with. Por último, la El SDK de Places Swift para iOS (versión preliminar) usa la versión AutocompleteRequest.

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 autocompletado

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 y el manejo de errores. El nuevo SDK de Places Swift para iOS (versión preliminar) es compatible con la simultaneidad, 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 Quita la inicialización de GMSPlacesClient y GMSPlaceProperty declaración. En el SDK de Places Swift para iOS (versión preliminar), el método y los nombres de clase se actualizaron para que se quitaran los "GMS" y se debe actualizar según corresponda; p.ej., GMSFetchPlaceRequest se convierte en FetchPlaceRequest.

Manejo de tipos

El nuevo método fetchPlace usa un control de tipo mejorado. Si bien el código anterior requiere pasar los valores sin procesar de la propiedad, el código nuevo no requiere a los desarrolladores recuperar explícitamente valores sin procesar aquí, lo que mejora la concisión y la legibilidad.

Simultaneidad

Además, el nuevo método admite la simultaneidad, lo que permite reemplazar el devolución de llamada en placesClient.fetchPlace con 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)")
}