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 SDK na iOS w Swift 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 pakietu Places Swift SDK na iOS do projektu

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 funkcji 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. W końcu pakiet SDK Miejsc na Swift używa ulepszonego elementu 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()

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 wykorzystuje wzorzec switch/await. Funkcje zwrotne mogą komplikować strukturę kodu i obsługę 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))")
}

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

W wersji 10.4 pakietu SDK Miejsc na iOS wycofaliśmy te klasy, metody i typedefy: Nie będą one już dostępne w wersji 11.0, która zostanie udostępniona w III kwartale 2026 r.

Ta tabela zawiera 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 inicjację GMSPlacesClient oraz deklarację GMSPlaceProperty. W pakiecie Places SDK na platformę Swift nazwy metod i klas zostały zaktualizowane przez usunięcie prefiksu „GMS”. Musisz odpowiednio zaktualizować kod, np. GMSFetchPlaceRequest zmienić na FetchPlaceRequest.

Obsługa typów

Nowa metoda fetchPlace wykorzystuje ulepszoną obsługę typów. Stary kod wymagał przekazywania surowych wartości usługi, ale nowy kod nie wymaga od programistó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.