Migracja do pakietu SDK Places Swift na iOS (wersja przedpremierowa)

Migracja z pakietu SDK Miejsc na iOS do pakietu SDK Miejsc Swift na iOS (wersja w podglądzie) powinna być prosta i można ją przeprowadzić stopniowo. Struktury w Swift SDK do obsługi Places na iOS (wersja podglądowa) nie są zgodne z odpowiednimi strukturami w języku Objective-C, dlatego zalecamy przeniesienie oddzielnych fragmentów funkcji na podstawie użycia interfejsów API w GMSPlacesClient.

Dodawanie do projektu pakietu SDK Miejsca Swift na iOS (wersja podglądowa)

Aby korzystać z pakietu SDK Swift Miejsca na iOS (wersja podglądowa), wykonaj te czynności:

  1. Włącz Places API (nowość).
  2. Dodaj pakiet Places Swift SDK na iOS (wersja podglądowa) do swoich zależności. Możesz zainstalować GooglePlaces lub GooglePlacesSwift.

  3. Zainicjuj klienta Places za pomocą funkcji PlacesClient.

Przykład migracji krok po kroku

Załóżmy na przykład, że aplikacja korzystająca z pakietu SDK Miejsc na iOS otrzymuje sugestie autouzupełniania na podstawie tekstu, a następnie pobiera szczegóły pierwszej propozycji miejsca. W przypadku pakietu SDK Miejsc na iOS istniejący 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))")
  }
}

Aktualizacja miejsca początkowego klienta

Aby zmodernizować kod i korzystać z funkcji nowego pakietu SDK, musisz zastąpić GMSPlacesClient obiektem PlacesClient. Dodatkowo w nowej metodzie zmieniły się nazwy parametrów, więc musisz zmienić parametr na from zamiast with. Na koniec warto wspomnieć, że pakiet SDK Miejsca Swift na iOS (wersja podglądowa) korzysta z uaktualnionego 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()

Zmień prośbę o autouzupełnianie

Możesz zacząć od zaktualizowania procesu żądania autouzupełniania. Stary kod używa wywołania zwrotnego do zapytania o sugestie autouzupełniania, a nowy kod używa wzorca switch/await. Funkcja wywołania zwrotnego może zwiększać złożoność struktury kodu i obsługi błędów. Nowy pakiet SDK Miejsca Swift na iOS (w wersji wstępnym) obsługuje równoległość, 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))")
}

Zmiana nazw metod i klas

Na koniec dokończ migrację, przeprowadzając refaktoryzację kodu fetchPlace i usuwając zarówno inicjalizację GMSPlacesClient, jak i deklarację GMSPlaceProperty. W pakiecie SDK Miejsca Swift na iOS (wersja podglądowa) nazwy metod i klas zostały zmienione w celu usunięcia prefiksu „GMS” i muszą zostać odpowiednio zaktualizowane. GMSFetchPlaceRequest zmienia się w FetchPlaceRequest.

Obsługa typu

Nowa metoda fetchPlace korzysta z ulepszonego obsługiwania typów. Podczas gdy stary kod wymagał przekazywania wartości surowych obiektu, nowy kod nie wymaga od programistów jawnego pobierania wartości surowych, co zwiększa zwięzłość i czytelność kodu.

Równoczesność

Nowa metoda obsługuje też równoczesność, co pozwala zastąpić funkcję wywołania zwrotnego w funkcji placesClient.fetchPlace wzorcem switch/await w funkcji 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 Places Swift SDK na iOS (wersja podglądowa).