Migracja z pakietu Places SDK na iOS do pakietu Places Swift SDK na iOS powinna być prosta i można ją przeprowadzić stopniowo. Ponieważ struktury w pakiecie Places Swift SDK na iOS nie są zgodne z ich odpowiednikami opartymi na Objective-C, zalecamy migrację dyskretnych fragmentów funkcjonalności na podstawie użycia interfejsów API w GMSPlacesClient.
Dodawanie pakietu Places Swift SDK na iOS do projektu
Aby korzystać z pakietu Places Swift SDK na iOS, musisz wykonać te czynności:
- Włącz interfejs Places API (nowy).
Dodaj pakiet Places Swift SDK do zależności. Możesz zainstalować
GooglePlaces,GooglePlacesSwift, lub oba te pakiety.Zainicjuj klienta Places za pomocą
PlacesClient.
Przykład migracji krok po kroku
Załóżmy, że aplikacja korzystająca z pakietu Places SDK na iOS otrzymuje sugestie autouzupełniania na podstawie wpisanego tekstu, a następnie pobiera szczegóły pierwszej sugestii miejsca. W przypadku pakietu Places SDK na iOS dotychczasowy 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 wykorzystać możliwości nowego pakietu SDK, musisz zastąpić GMSPlacesClient elementem PlacesClient. Ponadto w nowej metodzie zmieniono nazwy parametrów, więc musisz zmienić parametr z with na from. Pakiet Places Swift SDK używa też ulepszonego
AutocompleteRequest.
Zaktualizowany kod
// Initialize Places Swift Client.
let _ = PlacesClient.provideAPIKey(apiKey)
let placesSwiftClient = PlacesClient.shared
Oryginalny kod
// Initialize Places Client.
GMSPlacesClient.provideAPIKey(apiKey)
let client = GMSPlacesClient.shared()
Aktualizowanie żądania autouzupełniania
Możesz zacząć od zaktualizowania przepływu żądania autouzupełniania. Stary kod używa wywołania zwrotnego do żądania sugestii autouzupełniania, a nowy kod używa wzorca switch/await. Wywołania zwrotne mogą skomplikować strukturę kodu i obsługę błędów. Nowy pakiet Places Swift SDK 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 typedefów
Te klasy, metody i typedefy w pakiecie Places SDK na iOS zostały wycofane w wersji 10.4. Nie będą już dostępne w wersji 11.0, która zostanie opublikowana w trzecim kwartale 2026 r.
Ta tabela zawiera 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 inicjację GMSPlacesClient, jak i deklarację GMSPlaceProperty. W pakiecie Places Swift SDK nazwy metod i klas
zostały zaktualizowane, aby usunąć prefiks „GMS”, i należy je odpowiednio zaktualizować.
Na przykład GMSFetchPlaceRequest staje się FetchPlaceRequest.
Obsługa typów
Nowa metoda fetchPlace używa ulepszonej obsługi typów. Stary kod wymagał przekazywania surowych wartości właściwości, a nowy kod nie wymaga od deweloperów jawnego pobierania surowych wartości, co zwiększa zwięzłość i czytelność.
Współbieżność
Nowa metoda obsługuje też współbieżność, co pozwala zastąpić wywołanie zwrotne 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.