La migrazione da Places SDK for iOS a Places Swift SDK for iOS dovrebbe essere semplice e può essere eseguita in modo incrementale. Poiché le struct in Places Swift SDK for iOS non sono compatibili con le controparti basate su Objective-C, ti consigliamo di eseguire la migrazione di blocchi discreti di funzionalità in base agli utilizzi delle API in GMSPlacesClient.
Aggiungere Places Swift SDK for iOS al progetto
Per utilizzare Places Swift SDK for iOS, sono necessari i seguenti passaggi:
- Abilita l'API Places (New).
Aggiungi Places Swift SDK alle dipendenze. Puoi scegliere di installare
GooglePlaces,GooglePlacesSwift, o entrambi.Inizializza il client Places con
PlacesClient.
Esempio di migrazione passo passo
Ad esempio, supponiamo che un'app che utilizza Places SDK for iOS riceva suggerimenti di completamento automatico in base a un input di testo, quindi recuperi i dettagli del primo suggerimento di luogo. Utilizzando Places SDK for iOS, il codice esistente potrebbe essere simile al seguente:
// 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))")
}
}
Aggiornare l'inizializzatore del client Places
Per modernizzare il codice e sfruttare le funzionalità del nuovo SDK, dovrai sostituire GMSPlacesClient con PlacesClient. Inoltre, i nomi dei parametri vengono modificati nel nuovo metodo, quindi dovrai aggiornare il parametro a from anziché with. Infine, il
Places Swift SDK utilizza l'
AutocompleteRequest aggiornato.
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()
Aggiornare la richiesta di completamento automatico
Potresti iniziare aggiornando il flusso delle 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 callback possono aggiungere complessità alla struttura del codice e alla gestione degli errori. Il nuovo Places Swift SDK supporta la concorrenza, il 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))")
}
Sostituire classi, metodi e typedef deprecati
Le seguenti classi, metodi e typedef in Places SDK for iOS non sono più disponibili nella versione 11.0 e successive.
Questa tabella mostra i metodi deprecati e le relative sostituzioni:
| Deprecato | Sostituzione |
|---|---|
currentPlaceWithCallback o findPlaceLikelihoodsFromCurrentLocationWithPlaceFields |
searchNearbyWithRequest |
lookUpPlaceID o fetchPlaceFromPlaceID |
fetchPlaceWithRequest |
lookUpPhotosForPlaceID o loadPlacePhoto |
fetchPhotoWithRequest |
GMSAutocompletePrediction |
AutocompleteSuggestion |
findAutocompletePredictionsFromQuery o GMSAutocompleteFetcher |
fetchAutocompleteSuggestionsFromRequest |
isOpenWithPlaceID o isOpenWithPlace |
isOpenWithRequest |
GMSAutocompleteResultsViewController, GMSAutocompleteTableDataSource o GMSAutocompleteViewController |
placeAutocomplete |
Aggiornare i nomi di metodi e classi
Infine, completa la migrazione eseguendo il refactoring del codice fetchPlace e rimuovendo sia l'inizializzazione di GMSPlacesClient sia la dichiarazione di GMSPlaceProperty. In Places Swift SDK, i nomi di metodi e 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 il passaggio dei valori non elaborati della proprietà, il nuovo codice non richiede agli sviluppatori di recuperare esplicitamente i valori non elaborati, migliorando così la concisione e la leggibilità.
Concorrenza
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 per scoprire le nuove funzionalità e le modifiche.