Zum Places Swift SDK for iOS migrieren

Die Migration vom Places SDK for iOS (Legacy) zum Places Swift SDK for iOS sollte unkompliziert sein und kann schrittweise erfolgen. Da Strukturen im Places Swift SDK for iOS nicht mit ihren Objective-C-basierten Entsprechungen kompatibel sind, empfehlen wir, einzelne Funktionsblöcke basierend auf der Verwendung von APIs in GMSPlacesClient zu migrieren.

Places Swift SDK for iOS zu Ihrem Projekt hinzufügen

Die folgenden Schritte sind erforderlich, um das Places Swift SDK for iOS zu verwenden:

  1. Aktivieren Sie die Places API (New).
  2. Fügen Sie das Places Swift SDK zu Ihren Abhängigkeiten hinzu. Sie können GooglePlaces, GooglePlacesSwift oder beides installieren.

  3. Initialisieren Sie den Places-Client mit PlacesClient.

Schritt-für-Schritt-Beispiel für die Migration

Angenommen, eine App, die das Places SDK for iOS verwendet, erhält automatisch vervollständigte Vorschläge auf Grundlage einer Texteingabe und ruft dann die Details des ersten Ortsvorschlags ab. Wenn Sie das Places SDK for iOS verwenden, sieht der vorhandene Code möglicherweise so aus:

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

Places-Client-Initialisierung aktualisieren

Wenn Sie den Code modernisieren und die Funktionen des neuen SDK nutzen möchten, müssen Sie „GMSPlacesClient“ durch „PlacesClient“ ersetzen. Außerdem werden die Parameternamen in der neuen Methode geändert. Sie müssen den Parameter also in from statt with ändern. Schließlich wird im Places Swift SDK die aktualisierte AutocompleteRequest verwendet.

Aktualisierter Code

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

Original code

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

Anfrage für automatische Vervollständigung aktualisieren

Sie könnten damit beginnen, den Ablauf der Autocomplete-Anfrage zu aktualisieren. Im alten Code wird ein Callback verwendet, um automatisch vervollständigte Vorschläge anzufordern. Im neuen Code wird ein switch/await-Muster verwendet. Callbacks können die Codestruktur und die Fehlerbehandlung komplexer machen. Das neue Places Swift SDK unterstützt Nebenläufigkeit, was asynchrone Vorgänge vereinfacht.

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

Verworfene Klassen, Methoden und Typedefs ersetzen

Die folgenden Klassen, Methoden und Typedefs im Places SDK for iOS sind ab Version 11.0 nicht mehr verfügbar.

In dieser Tabelle sind die verworfenen Methoden und ihre Ersatzmethoden aufgeführt:

Verworfen Ersatz
currentPlaceWithCallback oder findPlaceLikelihoodsFromCurrentLocationWithPlaceFields searchNearbyWithRequest
lookUpPlaceID oder fetchPlaceFromPlaceID fetchPlaceWithRequest
lookUpPhotosForPlaceID oder loadPlacePhoto fetchPhotoWithRequest
GMSAutocompletePrediction AutocompleteSuggestion
findAutocompletePredictionsFromQuery oder GMSAutocompleteFetcher fetchAutocompleteSuggestionsFromRequest
isOpenWithPlaceID oder isOpenWithPlace isOpenWithRequest
GMSAutocompleteResultsViewController, GMSAutocompleteTableDataSource oder GMSAutocompleteViewController placeAutocomplete

Methoden- und Klassennamen aktualisieren

Schließen Sie die Migration ab, indem Sie den fetchPlace-Code refaktorieren und sowohl die GMSPlacesClient-Initialisierung als auch die GMSPlaceProperty-Deklaration entfernen. Im Places Swift SDK wurden die Methoden- und Klassennamen aktualisiert, um das Präfix „GMS“ zu entfernen. Sie müssen entsprechend aktualisiert werden, z. B. wird GMSFetchPlaceRequest zu FetchPlaceRequest.

Typverarbeitung

Die neue fetchPlace-Methode verwendet eine verbesserte Typverarbeitung. Während im alten Code die Rohwerte der Property übergeben werden mussten, müssen Entwickler im neuen Code die Rohwerte hier nicht explizit abrufen. Das verbessert die Übersichtlichkeit und Lesbarkeit.

Gleichzeitigkeit

Außerdem unterstützt die neue Methode Nebenläufigkeit, sodass der Callback in placesClient.fetchPlace durch ein switch/await-Muster in placesSwiftClient.fetchPlace ersetzt werden kann.

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

Auf dem Laufenden bleiben

Informationen zu neuen Funktionen und Änderungen finden Sie auf der Seite mit den Versionshinweisen für das Places Swift SDK for iOS.