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

La migrazione da Places SDK for iOS a Places Swift SDK for iOS (anteprima) dovrebbe essere semplice e può essere eseguita in modo incrementale. Poiché le strutture nell'SDK Swift di Places per iOS (anteprima) non sono compatibili con le loro controparti basate su Objective-C, ti consigliamo di eseguire la migrazione di parti discrete di funzionalità in base all'utilizzo delle API in GMSPlacesClient.

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

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

  1. Abilita l'API Places (nuova).
  2. Aggiungi l'SDK Places Swift per iOS (anteprima) alle tue dipendenze. Puoi scegliere di installare GooglePlaces, GooglePlacesSwift o entrambi.

  3. Inizializza il client Places con PlacesClient.

Esempio di migrazione passo passo

Ad esempio, supponiamo che un'app che utilizza Places SDK per iOS riceva suggerimenti di completamento automatico in base a un input di testo, quindi recuperi i dettagli del primo suggerimento di luogo. Se utilizzi Places SDK per iOS, il codice esistente potrebbe avere il seguente aspetto:

// 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'inizializzatore di Places Client

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, quindi dovrai aggiornare il parametro su from anziché with. Infine, l'SDK Swift Places per iOS (anteprima) utilizza la richiesta di completamento automatico AutocompleteRequest di cui è stato eseguito l'upgrade.

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

Potresti iniziare aggiornando il flusso di richieste di completamento automatico. Il vecchio codice utilizza un callback per richiedere suggerimenti di completamento automatico, mentre il nuovo codice utilizza un pattern switch/await. I richiami possono aumentare la complessità della struttura del codice e della gestione degli errori. Il nuovo SDK Swift di Places per iOS (anteprima) supporta la concorrenza, 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 il metodo e i nomi delle classi

Infine, completa la migrazione eseguendo il refactoring del codice fetchPlace erimuovendo sia l'inizializzazione GMSPlacesClient sia la dichiarazione GMSPlaceProperty. Nell'SDK Swift Places per iOS (anteprima), i metodi e i nomi delle classi sono stati aggiornati per rimuovere il prefisso "GMS" e devono essere aggiornati di conseguenza.ad es. GMSFetchPlaceRequest diventa FetchPlaceRequest.

Gestione dei tipi

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

Contemporaneità

Inoltre, il nuovo metodo supporta la concorrenza, consentendo di sostituire il 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)")
}

Rimanere sempre al corrente

Visita la pagina delle note di rilascio di Places Swift SDK for iOS (anteprima) per scoprire le nuove funzionalità e le modifiche.