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

Migracja z pakietu SDK Miejsc na iOS do Pakiet SDK Places Swift na iOS (wersja testowa) powinien być prosty i łatwo dostępny stopniowo. Elementy struct w pakiecie SDK Places Swift na iOS (wersja testowa) nie są zgodne z ich odpowiednikami w programie Objective-C, zalecamy migrację na podstawie wykorzystania interfejsów API w GMSPlacesClient.

Dodawanie do projektu pakietu SDK Places Swift na iOS (wersja testowa)

Aby korzystać z pakietu SDK Places Swift na iOS (wersja testowa):

  1. Włączanie interfejsu Places API (Nowość).
  2. Dodaj parametr Places Swift SDK na iOS (wersja przedpremierowa) do zależności.
  3. Zainicjuj klienta Miejsc za pomocą PlacesClient

Przykład szczegółowej migracji

Załóżmy na przykład, że aplikacja korzystająca z pakietu SDK Miejsc na iOS odbiera sugestie autouzupełniania na podstawie wpisanego tekstu, a potem pobiera szczegóły sugestii dotyczące pierwszego miejsca. Zastosowanie SDK Miejsc dla iOS, istniejący kod może wyglądać np.:

// 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 inicjatora klienta Miejsc

Aby zmodernizować kod i wykorzystać możliwości nowego pakietu SDK, trzeba zastąpić obiekt GMSPlacesClient obiektem PlacesClient. Dodatkowo nazwy parametrów są zmieniane w nowej metodzie, więc musisz zaktualizować do from zamiast with. Pamiętaj też, że Pakiet SDK Miejsc Swift na iOS (wersja testowa) korzysta z uaktualnionych AutocompleteRequest.

Zaktualizowano 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()

Zaktualizuj żądanie autouzupełniania

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. Wywołania zwrotne mogą komplikować strukturę kodu i obsługi błędów. Nowy pakiet SDK Places Swift na iOS (wersja testowa) obsługuje równoczesność, które 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))")
}

Zaktualizuj nazwy metod i klas

Na koniec dokończ migrację przez refaktoryzację kodu fetchPlace i usunięto zarówno inicjalizację GMSPlacesClient, jak i GMSPlaceProperty tej deklaracji. Nazwy metod i klas w pakiecie Places Swift SDK na iOS (wersja testowa) zostały zaktualizowane tak, aby usunąć „GMS” i należy go odpowiednio zaktualizować; np. GMSFetchPlaceRequest zmienia wartość na FetchPlaceRequest.

Obsługa pisania

Nowa metoda fetchPlace korzysta z ulepszonej obsługi typów. Stary kod wymagane jest przekazanie surowych wartości właściwości, nowy kod nie wymaga pobieranie przez programistów jawnie nieprzetworzonych wartości, poprawiając w ten sposób i czytelność.

Równoczesność

Dodatkowo nowa metoda obsługuje równoczesność, co pozwala zastąpić metodę wywołanie zwrotne w placesClient.fetchPlace z 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)")
}