Migracja do pakietu SDK Miejsc Swift na iOS

Migracja z pakietu Places SDK na iOS do pakietu Places Swift SDK na iOS powinna być prosta i można ją przeprowadzić stopniowo. Struktury w pakiecie Places Swift SDK na iOS nie są zgodne z odpowiednikami opartymi na Objective-C, dlatego zalecamy przenoszenie poszczególnych fragmentów funkcjonalności na podstawie użycia interfejsów API w GMSPlacesClient.

Dodawanie do projektu pakietu Places Swift SDK na iOS

Aby korzystać z pakietu Places Swift SDK na iOS, wykonaj te czynności:

  1. Włącz Places API (nowość).
  2. Dodaj do zależności pakiet SDK Miejsc w Swift. Możesz zainstalować GooglePlaces, GooglePlacesSwift lub obie te aplikacje.

  3. Zainicjuj klienta Places za pomocą kodu 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 wpisanego tekstu, a następnie pobiera szczegóły pierwszej sugerowanej lokalizacji. 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))")
  }
}

Aktualizowanie inicjatora klienta Miejsc

Aby zmodernizować kod i skorzystać z nowych możliwości pakietu SDK, musisz zastąpić GMSPlacesClient elementem PlacesClient. Dodatkowo w nowej metodzie zmieniono nazwy parametrów, więc musisz zaktualizować parametr na from zamiast with. Wreszcie pakiet Places SDK na Swift używa ulepszonego elementu AutocompleteRequest.

Zaktualizowany kod

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

Kod oryginalny

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

Aktualizowanie żądania autouzupełniania

Możesz zacząć od zaktualizowania przepływu żądań autouzupełniania. Stary kod używa wywołania zwrotnego do wysyłania prośby o sugestie autouzupełniania, a nowy kod korzysta z wzorca switch/await. Funkcje zwrotne mogą zwiększać złożoność struktury kodu i obsługi błędów. Nowy pakiet Places SDK na Swift obsługuje współbieżność, 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))")
}

Aktualizowanie nazw metod i klas

Na koniec dokończ migrację, refaktoryzując kod fetchPlace i usuwając zarówno inicjalizację GMSPlacesClient, jak i deklarację GMSPlaceProperty. W pakiecie Places SDK na platformę Swift nazwy metod i klas zostały zaktualizowane w celu usunięcia prefiksu „GMS” i muszą zostać odpowiednio zmienione, np.: GMSFetchPlaceRequest zmienia się w FetchPlaceRequest.

Obsługa typów

Nowa metoda fetchPlace korzysta z ulepszonego sposobu obsługi typów. Stary kod wymagał przekazywania surowych wartości usługi, a nowy kod nie wymaga od deweloperów jawnego pobierania surowych wartości, co zwiększa zwięzłość i czytelność.

Równoczesność

Nowa metoda obsługuje też współbieżność, co umożliwia zastąpienie wywołania zwrotnego w placesClient.fetchPlace wzorcem switch/awaitplacesSwiftClient.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 pakietu Places Swift SDK na iOS.