Zum Places Swift SDK for iOS migrieren

Die Migration vom Places SDK for iOS 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 Pendants kompatibel sind, empfehlen wir, einzelne Funktionsblöcke basierend auf der Verwendung von APIs in GMSPlacesClient zu migrieren.

Places Swift SDK for iOS in Ihr Projekt einbinden

Folgende 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 auf Grundlage einer Texteingabe Vorschläge für die automatische Vervollständigung 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

Um den Code zu modernisieren und die Funktionen des neuen SDK zu nutzen, müssen Sie den GMSPlacesClient durch den PlacesClient ersetzen. Außerdem wurden die Parameternamen in der neuen Methode geändert. Sie müssen den Parameter also in from anstelle von 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()

Autocomplete-Anfrage aktualisieren

Sie könnten damit beginnen, den Ablauf der Anfragen zur automatischen Vervollständigung zu aktualisieren. Im alten Code wird ein Callback verwendet, um Vorschläge zur automatischen Vervollständigung anzufordern, während im neuen Code das Muster switch/await verwendet wird. Callbacks können die Codestruktur und die Fehlerbehandlung komplexer machen. Das neue Places Swift SDK unterstützt die Parallelität, 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))")
}

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.: GMSFetchPlaceRequest wird zu FetchPlaceRequest.

Typverarbeitung

Die neue Methode fetchPlace verwendet eine verbesserte Typverarbeitung. Im alten Code mussten die Rohwerte der Property übergeben werden. Im neuen Code ist es nicht erforderlich, dass Entwickler Rohwerte explizit abrufen. Das verbessert die Übersichtlichkeit und Lesbarkeit.

Gleichzeitigkeit

Außerdem unterstützt die neue Methode die Parallelität, 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

Auf der Seite Versionshinweise zum Places Swift SDK for iOS finden Sie Informationen zu neuen Funktionen und Änderungen.