Migracja z pakietu Places SDK for iOS (starsza wersja) na Places Swift SDK for iOS powinna być prosta i można ją przeprowadzić stopniowo. Struktury w pakiecie Places SDK na iOS w Swift nie są zgodne z odpowiednikami opartymi na Objective-C, dlatego zalecamy przenoszenie poszczególnych części funkcjonalności 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 oba te elementy.Zainicjuj klienta Places za pomocą kodu
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 istniejący kod może wyglądać 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 korzystać z nowych funkcji pakietu SDK, musisz zastąpić GMSPlacesClient elementem PlacesClient. Dodatkowo w nowej metodzie zmieniono nazwy parametrów, więc musisz zaktualizować parametr z with na from. Pakiet Places SDK na Swift używa ulepszonego AutocompleteRequest.
Zaktualizowany kod
// Initialize Places Swift Client.
let _ = PlacesClient.provideAPIKey(apiKey)
let placesSwiftClient = PlacesClient.shared
Kod pierwotny
// Initialize Places Client.
GMSPlacesClient.provideAPIKey(apiKey)
let client = GMSPlacesClient.shared()
Aktualizowanie żądania autouzupełniania
Możesz zacząć od zaktualizowania przepływu żądań autouzupełniania. Stary kod używa wywołania zwrotnego do wysyłania prośby o sugestie autouzupełniania, a nowy kod korzysta z wzorca switch/await. Funkcje zwrotne mogą zwiększać złożoność struktury kodu i obsługi błędów. Nowy pakiet Places SDK na platformę Swift obsługuje współbieżność, 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 typedefy w pakiecie SDK Miejsc na iOS nie są już dostępne w wersji 11.0 i nowszych.
W tabeli poniżej znajdziesz wycofane metody i ich zamienniki:
| 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 zarówno inicjalizację GMSPlacesClient, jak i deklarację GMSPlaceProperty. W pakiecie Places SDK na platformę Swift nazwy metod i klas zostały zaktualizowane w celu usunięcia prefiksu „GMS” i muszą zostać odpowiednio zmienione, 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ść
Nowa metoda obsługuje też współbieżność, co umożliwia 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, odwiedź stronę z informacjami o wersji pakietu Places Swift SDK na iOS.