Переход с Places SDK для iOS на Places Swift SDK для iOS должен быть простым и может быть выполнен поэтапно. Поскольку структуры в Places Swift SDK для iOS несовместимы со своими аналогами на Objective-C, мы рекомендуем переносить отдельные фрагменты функциональности на основе использования API в GMSPlacesClient.
Add the Places Swift SDK for iOS to your project
Для использования Places Swift SDK для iOS необходимо выполнить следующие шаги:
- Enable the Places API (New) .
Добавьте SDK Places Swift в зависимости вашего приложения. Вы можете установить
GooglePlaces,GooglePlacesSwiftили оба варианта.Initialize the Places client with
PlacesClient.
Step-by-step migration example
В качестве примера предположим, что приложение, использующее Places SDK для iOS, получает подсказки автозаполнения на основе текстового ввода, а затем извлекает подробную информацию о первом предложенном месте. При использовании Places SDK для iOS существующий код может выглядеть примерно так:
// 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))")
}
}
Update the Places Client initializer
Для модернизации кода и использования возможностей нового SDK вам потребуется заменить GMSPlacesClient на PlacesClient. Кроме того, в новом методе изменены имена параметров, поэтому вам нужно будет обновить параметр from with . Наконец, SDK Places Swift использует обновленный AutocompleteRequest .
Updated code
// Initialize Places Swift Client.
let _ = PlacesClient.provideAPIKey(apiKey)
let placesSwiftClient = PlacesClient.shared
Исходный код
// Initialize Places Client.
GMSPlacesClient.provideAPIKey(apiKey)
let client = GMSPlacesClient.shared()
Update the autocomplete request
Начать можно с обновления алгоритма обработки запросов автозаполнения. В старом коде для запроса подсказок автозаполнения используется функция обратного вызова, а в новом — шаблон switch / await . Функции обратного вызова могут усложнять структуру кода и обработку ошибок. Новый SDK Places Swift поддерживает параллельное выполнение, что упрощает асинхронные операции.
// 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))")
}
Замените устаревшие классы, методы и определения типов.
Следующие классы, методы и определения типов в SDK Places для iOS устарели начиная с версии 10.4. Они больше не будут доступны в версии 11.0, которая будет выпущена в третьем квартале 2026 года.
В этой таблице показаны устаревшие методы и их замены:
| Устаревший | Замена |
|---|---|
currentPlaceWithCallback или findPlaceLikelihoodsFromCurrentLocationWithPlaceFields | searchNearbyWithRequest |
lookUpPlaceID or fetchPlaceFromPlaceID | fetchPlaceWithRequest |
lookUpPhotosForPlaceID or loadPlacePhoto | fetchPhotoWithRequest |
GMSAutocompletePrediction | AutocompleteSuggestion |
findAutocompletePredictionsFromQuery или GMSAutocompleteFetcher | fetchAutocompleteSuggestionsFromRequest |
isOpenWithPlaceID or isOpenWithPlace | isOpenWithRequest |
GMSAutocompleteResultsViewController , GMSAutocompleteTableDataSource или GMSAutocompleteViewController | placeAutocomplete |
Update method and class names
Наконец, завершите миграцию, переработав код fetchPlace и удалив инициализацию GMSPlacesClient и объявление GMSPlaceProperty . В SDK Places Swift имена методов и классов были обновлены, чтобы удалить префикс "GMS", и их необходимо обновить соответствующим образом; например, GMSFetchPlaceRequest становится FetchPlaceRequest .
Type-handling
Новый метод fetchPlace использует улучшенную обработку типов. Если старый код требовал передачи необработанных значений свойства, то новый код не требует от разработчиков явного получения необработанных значений, что повышает лаконичность и читаемость кода.
Параллелизм
Кроме того, новый метод поддерживает параллельное выполнение, позволяя заменить функцию обратного вызова в placesClient.fetchPlace на шаблон switch / await в 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)")
}
Будьте в курсе событий
Чтобы узнать о новых функциях и изменениях, посетите страницу с примечаниями к выпуску Places Swift SDK для iOS .