Migrar para o SDK do Places Swift para iOS (pré-lançamento)

A migração do SDK do Places para iOS para o SDK do Places Swift para iOS (pré-lançamento) é simples e pode ser feita de forma incremental. Como os structs no SDK do Places Swift para iOS (pré-lançamento) não são compatíveis com as contrapartes baseadas em Objective-C, recomendamos migrar partes discretas da funcionalidade com base no uso de APIs no GMSPlacesClient.

Adicionar o SDK do Places Swift para iOS (pré-lançamento) ao seu projeto

As etapas a seguir são necessárias para usar o SDK do Places Swift para iOS (pré-lançamento):

  1. Ative a API Places (nova).
  2. Adicione o SDK do Places Swift para iOS (pré-lançamento) às suas dependências. Você pode instalar GooglePlaces, GooglePlacesSwift ou ambos.

  3. Inicialize o cliente do Places com PlacesClient.

Exemplo de migração detalhada

Por exemplo, suponha que um app que usa o SDK do Places para iOS recebe sugestões de preenchimento automático com base em uma entrada de texto e, em seguida, busca os detalhes da primeira sugestão de lugar. Usando o SDK do Places para iOS, o código atual pode ser parecido com este:

// 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))")
  }
}

Atualizar o inicializador do cliente do Places

Para modernizar o código e aproveitar os recursos do novo SDK, você vai precisar substituir o GMSPlacesClient pelo PlacesClient. Além disso, os nomes dos parâmetros foram alterados no novo método. Portanto, você vai precisar atualizar o parâmetro para from em vez de with. Por fim, o SDK do Swift para iOS (pré-lançamento) usa a AutocompleteRequest atualizada.

Código atualizado

// 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()

Atualizar a solicitação de preenchimento automático

Você pode começar atualizando o fluxo de solicitação de preenchimento automático. O código antigo usa um callback para solicitar sugestões de preenchimento automático, enquanto o novo código emprega um padrão switch/await. Os callbacks podem aumentar a complexidade da estrutura do código e do processamento de erros. O novo SDK do Swift para iOS (pré-lançamento) do Places oferece suporte à simultaneidade, o que simplifica as operações assí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))")
}

Atualizar nomes de métodos e classes

Por fim, conclua a migração refatorando o código fetchPlace e removendo a inicialização GMSPlacesClient e a declaração GMSPlaceProperty. No SDK do Places Swift para iOS (pré-lançamento), o método e os nomes de classe foram atualizados para remover o prefixo "GMS" e precisam ser atualizados de acordo. GMSFetchPlaceRequest se torna FetchPlaceRequest.

Processamento de tipos

O novo método fetchPlace usa um processamento de tipo aprimorado. Enquanto o código antigo exigia a transmissão dos valores brutos da propriedade, o novo código não exige que os desenvolvedores busquem explicitamente valores brutos aqui, melhorando a concisão e a legibilidade.

Simultaneidade

Além disso, o novo método oferece suporte à simultaneidade, permitindo substituir o callback em placesClient.fetchPlace por um padrão switch/await em 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)")
}

Ficar por dentro

Acesse a página de notas da versão do SDK do Places Swift para iOS (pré-lançamento) para saber mais sobre os novos recursos e mudanças.