Миграция в Places Swift SDK для iOS

Переход с Places SDK для iOS на Places Swift SDK для iOS должен быть простым и может быть выполнен поэтапно. Поскольку структуры в Places Swift SDK для iOS несовместимы со своими аналогами на Objective-C, мы рекомендуем переносить отдельные фрагменты функциональности на основе использования API в GMSPlacesClient.

Добавьте SDK Places Swift для iOS в свой проект.

Для использования Places Swift SDK для iOS необходимо выполнить следующие шаги:

  1. Включите API для работы с местами (новая функция) .
  2. Добавьте SDK Places Swift в зависимости вашего приложения. Вы можете установить GooglePlaces , GooglePlacesSwift или оба варианта.

  3. Инициализируйте клиент Places с помощью PlacesClient .

Пример пошаговой миграции

В качестве примера предположим, что приложение, использующее 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))")
  }
}

Обновите инициализатор клиента Places.

Для модернизации кода и использования возможностей нового SDK вам потребуется заменить GMSPlacesClient на PlacesClient. Кроме того, в новом методе изменены имена параметров, поэтому вам нужно будет обновить параметр from with . Наконец, SDK Places Swift использует обновленный AutocompleteRequest .

Обновленный код

// Initialize Places Swift Client.
let _ = PlacesClient.provideAPIKey(apiKey)
let placesSwiftClient = PlacesClient.shared

Исходный код

// Initialize Places Client.
GMSPlacesClient.provideAPIKey(apiKey)
let client = GMSPlacesClient.shared()

Обновите запрос автозаполнения.

Начать можно с обновления алгоритма обработки запросов автозаполнения. В старом коде для запроса подсказок автозаполнения используется функция обратного вызова, а в новом — шаблон 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 или fetchPlaceFromPlaceID fetchPlaceWithRequest
lookUpPhotosForPlaceID or loadPlacePhoto fetchPhotoWithRequest
GMSAutocompletePrediction AutocompleteSuggestion
findAutocompletePredictionsFromQuery или GMSAutocompleteFetcher fetchAutocompleteSuggestionsFromRequest
isOpenWithPlaceID или isOpenWithPlace isOpenWithRequest
GMSAutocompleteResultsViewController , GMSAutocompleteTableDataSource или GMSAutocompleteViewController placeAutocomplete

Обновите названия методов и классов.

Наконец, завершите миграцию, переработав код fetchPlace и удалив инициализацию GMSPlacesClient и объявление GMSPlaceProperty . В SDK Places Swift имена методов и классов были обновлены, чтобы удалить префикс "GMS", и их необходимо обновить соответствующим образом; например, GMSFetchPlaceRequest становится FetchPlaceRequest .

Обработка типов

Новый метод 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 .