Переход на Places Swift SDK для iOS

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

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

Чтобы использовать Places Swift SDK для iOS, выполните следующие действия:

  1. Включите Places API (New).
  2. Добавьте Places Swift SDK в зависимости. Вы можете установить 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. Кроме того, в новом методе изменены названия параметров, поэтому вам нужно будет заменить параметр with на from. Наконец, Places Swift SDK использует обновленный 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. Обратные вызовы могут усложнить структуру кода и обработку ошибок. Новый Places Swift SDK поддерживает параллелизм, что упрощает асинхронные операции.

// 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))")
}

Замена устаревших классов, методов и определений типов

Следующие классы, методы и typedefs в Places SDK для iOS больше не доступны в версии 11.0 и более поздних.

В таблице ниже перечислены устаревшие методы и их замены.

Поддержка прекращена Замена
currentPlaceWithCallback или findPlaceLikelihoodsFromCurrentLocationWithPlaceFields searchNearbyWithRequest
lookUpPlaceID или fetchPlaceFromPlaceID fetchPlaceWithRequest
lookUpPhotosForPlaceID или loadPlacePhoto fetchPhotoWithRequest
GMSAutocompletePrediction AutocompleteSuggestion
findAutocompletePredictionsFromQuery или GMSAutocompleteFetcher fetchAutocompleteSuggestionsFromRequest
isOpenWithPlaceID или isOpenWithPlace isOpenWithRequest
GMSAutocompleteResultsViewController, GMSAutocompleteTableDataSource или GMSAutocompleteViewController placeAutocomplete

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

Наконец, завершите перенос, выполнив рефакторинг кода fetchPlace и удалив инициализацию GMSPlacesClient и объявление GMSPlaceProperty. В Places Swift SDK названия методов и классов были изменены, чтобы удалить префикс 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.