Миграция на 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 (новое) .
  2. Добавьте Places Swift SDK для iOS (предварительная версия) в свои зависимости.
  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 . Наконец, Places Swift SDK для iOS (предварительная версия) использует обновленный 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 для iOS (предварительная версия) поддерживает параллелизм, что упрощает асинхронные операции.

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

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

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