Przejście z pakietu Places SDK for iOS (starsza wersja) na pakiet Places Swift SDK for iOS powinno być proste i można je przeprowadzić stopniowo. Struktury w pakiecie Places Swift SDK na iOS nie są zgodne z ich odpowiednikami opartymi na Objective-C, dlatego zalecamy migrację odrębnych fragmentów funkcji na podstawie użycia interfejsów API w GMSPlacesClient.
Dodawanie pakietu Places Swift SDK for iOS do projektu
Aby korzystać z pakietu Places Swift SDK for iOS, musisz wykonać te czynności:
- Włącz Places API (nowość).
Dodaj pakiet SDK Places Swift do zależności. Możesz zainstalować
GooglePlaces,GooglePlacesSwiftlub obie te aplikacje.Zainicjuj klienta Places za pomocą
PlacesClient.
Przykład migracji krok po kroku
Załóżmy na przykład, że aplikacja korzystająca z pakietu Places SDK for iOS otrzymuje sugestie autouzupełniania na podstawie wpisanego tekstu, a następnie pobiera szczegóły pierwszej sugerowanej lokalizacji. W przypadku pakietu SDK Miejsc na iOS dotychczasowy kod może wyglądać mniej więcej tak:
// 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))")
}
}
Aktualizowanie inicjatora klienta Places
Aby zmodernizować kod i wykorzystać możliwości nowego pakietu SDK, musisz zastąpić GMSPlacesClient obiektem PlacesClient. Dodatkowo w nowej metodzie zmieniono nazwy parametrów, więc musisz zaktualizować parametr with na from. Na koniec pakiet Places Swift SDK używa uaktualnionej klasy AutocompleteRequest.
Zaktualizowany kod
// Initialize Places Swift Client.
let _ = PlacesClient.provideAPIKey(apiKey)
let placesSwiftClient = PlacesClient.shared
Kod oryginalny
// Initialize Places Client.
GMSPlacesClient.provideAPIKey(apiKey)
let client = GMSPlacesClient.shared()
Aktualizowanie żądania autouzupełniania
Możesz zacząć od zaktualizowania procesu żądania autouzupełniania. Stary kod używa wywołania zwrotnego do żądania sugestii autouzupełniania, a nowy kod wykorzystuje wzorzec switch/await. Wywołania zwrotne mogą zwiększyć złożoność struktury kodu i obsługi błędów. Nowy pakiet Places Swift SDK obsługuje równoczesność,
co upraszcza operacje asynchroniczne.
// 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))")
}
Zastępowanie wycofanych klas, metod i definicji typów
Te klasy, metody i definicje typów w pakiecie Places SDK na iOS nie są już dostępne w wersji 11.0 i nowszych.
Ta tabela zawiera wycofane metody i ich odpowiedniki:
| Wycofano | Zamiennik |
|---|---|
currentPlaceWithCallback lub findPlaceLikelihoodsFromCurrentLocationWithPlaceFields |
searchNearbyWithRequest |
lookUpPlaceID lub fetchPlaceFromPlaceID |
fetchPlaceWithRequest |
lookUpPhotosForPlaceID lub loadPlacePhoto |
fetchPhotoWithRequest |
GMSAutocompletePrediction |
AutocompleteSuggestion |
findAutocompletePredictionsFromQuery lub GMSAutocompleteFetcher |
fetchAutocompleteSuggestionsFromRequest |
isOpenWithPlaceID lub isOpenWithPlace |
isOpenWithRequest |
GMSAutocompleteResultsViewController, GMSAutocompleteTableDataSource lub GMSAutocompleteViewController |
placeAutocomplete |
Aktualizowanie nazw metod i klas
Na koniec dokończ migrację, refaktoryzując kod fetchPlace i usuwając inicjowanie GMSPlacesClient oraz deklarację GMSPlaceProperty. W pakiecie Places Swift SDK nazwy metod i klas zostały zaktualizowane, aby usunąć prefiks „GMS”. Należy je odpowiednio zaktualizować, np. GMSFetchPlaceRequest staje się FetchPlaceRequest.
Obsługa typów
Nowa metoda fetchPlace korzysta z ulepszonej obsługi typów. Stary kod wymagał przekazywania nieprzetworzonych wartości właściwości, natomiast nowy kod nie wymaga od deweloperów jawnego pobierania nieprzetworzonych wartości, co poprawia zwięzłość i czytelność.
Równoczesność
Dodatkowo nowa metoda obsługuje równoczesność, co pozwala na zastąpienie wywołania zwrotnego w placesClient.fetchPlace wzorcem switch/await w 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)")
}
Bycie na bieżąco
Aby dowiedzieć się więcej o nowych funkcjach i zmianach, wejdź na stronę z informacjami o wersji pakietu Places Swift SDK na iOS.