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:
- Abilita l'API Places (nuova).
Aggiungi l'SDK Places Swift per iOS (anteprima) alle tue 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 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.