Migracja do pakietu SDK Miejsc Swift na iOS

Przejście z pakietu Places SDK for iOS (starsza wersja) na pakiet Places Swift SDK for iOS powinno być proste i można je przeprowadzić stopniowo. Struktury w pakiecie Places Swift SDK na iOS nie są zgodne z ich odpowiednikami opartymi na Objective-C, dlatego zalecamy migrację odrębnych fragmentów funkcji 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 obie te aplikacje.

  3. Zainicjuj klienta Places za pomocą 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 dotychczasowy kod może wyglądać mniej więcej 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 wykorzystać możliwości nowego pakietu SDK, musisz zastąpić GMSPlacesClient obiektem PlacesClient. Dodatkowo w nowej metodzie zmieniono nazwy parametrów, więc musisz zaktualizować parametr with na from. Na koniec pakiet Places Swift SDK używa uaktualnionej klasy 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 procesu żądania autouzupełniania. Stary kod używa wywołania zwrotnego do żądania sugestii autouzupełniania, a nowy kod wykorzystuje wzorzec switch/await. Wywołania zwrotne mogą zwiększyć złożoność struktury kodu i obsługi błędów. Nowy pakiet Places Swift SDK obsługuje równoczesność, 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 definicje typów w pakiecie Places SDK na iOS nie są już dostępne w wersji 11.0 i nowszych.

Ta tabela zawiera wycofane metody i ich odpowiedniki:

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 inicjowanie GMSPlacesClient oraz deklarację GMSPlaceProperty. W pakiecie Places Swift SDK nazwy metod i klas zostały zaktualizowane, aby usunąć prefiks „GMS”. Należy je odpowiednio zaktualizować, 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ść

Dodatkowo nowa metoda obsługuje równoczesność, co pozwala na 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, wejdź na stronę z informacjami o wersji pakietu Places Swift SDK na iOS.