Migracja do pakietu SDK Miejsc Swift na iOS

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

Dodawanie pakietu Places Swift SDK for iOS do projektu

Aby korzystać z pakietu Places Swift SDK for iOS, musisz wykonać te czynności:

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

  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 Places SDK for 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 Places

Aby zmodernizować kod i korzystać z nowych funkcji pakietu SDK, musisz zastąpić GMSPlacesClient elementem PlacesClient. Dodatkowo w nowej metodzie zmieniono nazwy parametrów, więc musisz zaktualizować parametr z with na from. Pakiet Places SDK na Swift używa ulepszonego AutocompleteRequest.

Zaktualizowany kod

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

Kod pierwotny

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

Zastępowanie wycofanych klas, metod i definicji typów

Te klasy, metody i typedefy w pakiecie SDK Miejsc na iOS nie są już dostępne w wersji 11.0 i nowszych.

W tabeli poniżej znajdziesz wycofane metody i ich zamienniki:

Wycofano Zamiennik
currentPlaceWithCallback lub findPlaceLikelihoodsFromCurrentLocationWithPlaceFields searchNearbyWithRequest
lookUpPlaceID lub fetchPlaceFromPlaceID fetchPlaceWithRequest
lookUpPhotosForPlaceID lub loadPlacePhoto fetchPhotoWithRequest
GMSAutocompletePrediction AutocompleteSuggestion
findAutocompletePredictionsFromQuery lub GMSAutocompleteFetcher fetchAutocompleteSuggestionsFromRequest
isOpenWithPlaceID lub isOpenWithPlace isOpenWithRequest
GMSAutocompleteResultsViewController, GMSAutocompleteTableDataSource lub GMSAutocompleteViewController placeAutocomplete

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 staje się FetchPlaceRequest.

Obsługa typów

Nowa metoda fetchPlace korzysta z ulepszonej obsługi typów. Stary kod wymagał przekazywania nieprzetworzonych wartości właściwości, natomiast nowy kod nie wymaga od deweloperów jawnego pobierania nieprzetworzonych wartości, co poprawia 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/await w 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 pakietu Places Swift SDK na iOS.