Esegui la migrazione all'SDK Places Swift per iOS (anteprima)

Migrazione da Places SDK per iOS a L'SDK Places Swift per iOS (anteprima) deve essere semplice e facile da usare in modo incrementale. Poiché gli struct nell'SDK Places Swift per iOS (anteprima), non sono compatibili con le controparti basate su Objective-C, ti consigliamo di eseguire blocchi discreti di funzionalità basati sull'utilizzo delle API in GMSPlacesClient.

Aggiungi l'SDK Places Swift per iOS (anteprima) al tuo progetto

Per utilizzare l'SDK Places Swift per iOS (anteprima), sono necessari i seguenti passaggi:

  1. Abilita l'API Places (Nuova).
  2. Aggiungi Places Swift SDK per iOS (anteprima) alle tue dipendenze.
  3. Inizializza il client Places con PlacesClient.

Esempio di migrazione passo passo

Ad esempio, supponiamo che un'app che utilizza Places SDK for iOS riceve suggerimenti di completamento automatico in base a un input di testo, quindi recupera dettagli del suggerimento per il primo luogo. Utilizzo SDK Places per iOS, il codice esistente potrebbe avere un aspetto ad esempio:

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

Aggiorna l'inizializzazione del client Places

Per modernizzare il codice e sfruttare le funzionalità del nuovo SDK, devi sostituire GMSPlacesClient con PlacesClient. Inoltre, i nomi dei parametri vengono modificati nel nuovo metodo, pertanto devi aggiornare su from anziché su with. Infine, L'SDK Places Swift per iOS (anteprima) utilizza l'upgrade eseguito AutocompleteRequest.

Codice aggiornato

// Initialize Places Swift Client.
let _ = PlacesClient.provideAPIKey(apiKey)
let placesSwiftClient = PlacesClient.shared

Codice originale

// Initialize Places Client.
GMSPlacesClient.provideAPIKey(apiKey)
let client = GMSPlacesClient.shared()

Aggiorna la richiesta di completamento automatico

Per iniziare, puoi aggiornare il flusso di richiesta di completamento automatico. Il vecchio codice utilizza un per richiedere suggerimenti di completamento automatico, mentre il nuovo codice impiega un Sequenza switch/await. I callback possono aggiungere complessità alla struttura del codice e e la gestione degli errori. Il nuovo SDK Places Swift per iOS (anteprima) supporta la contemporaneità, che semplifica le operazioni asincrone.

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

Aggiorna i nomi di metodi e classi

Infine, completa la migrazione eseguendo il refactoring del codice fetchPlace e rimuovendo sia l'inizializzazione di GMSPlacesClient sia GMSPlaceProperty dichiarazione. Nell'SDK Places Swift per iOS (anteprima), il metodo e i nomi delle classi sono stati aggiornati in modo da rimuovere e deve essere aggiornato di conseguenza; ad es. GMSFetchPlaceRequest diventa FetchPlaceRequest.

Gestione dei tipi

Il nuovo metodo fetchPlace utilizza una gestione dei tipi migliorata. Mentre il vecchio codice necessario trasmettere i valori non elaborati della proprietà, il nuovo codice non richiede agli sviluppatori di recuperare esplicitamente valori non elaborati, migliorando così la la leggibilità.

Contemporaneità

Inoltre, il nuovo metodo supporta la contemporaneità, consentendo di sostituire il valore callback in placesClient.fetchPlace con un pattern switch/await in 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)")
}