Migration zum Places Swift SDK for iOS (Vorabversion)

Migration vom Places SDK for iOS zu Das Places Swift SDK for iOS (Vorabversion) sollte einfach sein und inkrementell. Da die Strukturen im Places Swift SDK for iOS (Vorabversion) nicht mit ihren Objective-C-basierten Pendants kompatibel sind, empfehlen wir, einzelne Funktionsbereiche zu migrieren, die auf der Verwendung von APIs in GMSPlacesClient basieren.

Places Swift SDK for iOS (Vorabversion) zum Projekt hinzufügen

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

  1. Aktivieren Sie die Places API (New).
  2. Fügen Sie den Places Swift SDK for iOS (Vorabversion) zu Ihren Abhängigkeiten.
  3. Initialisieren Sie den Places-Client mit PlacesClient

Beispiel für eine Schritt-für-Schritt-Migration

Beispiel: In einer App wird das Places SDK for iOS verwendet. erhält auf Grundlage der Texteingabe automatisch vervollständigte Vorschläge und ruft dann die Details zum Vorschlag für den ersten Ort. Mit Places SDK for iOS verwenden, sieht der vorhandene Code möglicherweise wie zum Beispiel so:

// 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-Initialisierer aktualisieren

Um den Code zu modernisieren und die Funktionen des neuen SDK zu nutzen, GMSPlacesClient muss durch PlacesClient ersetzt werden. Darüber hinaus enthält der in der neuen Methode geändert werden, müssen Sie das auf from statt auf with. Die Funktion Places Swift SDK for iOS (Vorabversion) verwendet das aktualisierte AutocompleteRequest.

Aktualisierter Code

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

Ursprünglicher Code

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

Autocomplete-Anfrage aktualisieren

Aktualisieren Sie dazu zuerst den Ablauf für die Anfrage zur automatischen Vervollständigung. Der alte Code verwendet eine -Rückruf zurück, um Vorschläge für die automatische Vervollständigung anzufordern. Im neuen Code wird hingegen switch/await-Muster. Callbacks können die Codestruktur und die Fehlerbehandlung verkomplizieren. Das neue Places Swift SDK for iOS (Vorabversion) 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 Entfernen der Initialisierung GMSPlacesClient und GMSPlaceProperty Erklärung. Im Places Swift SDK for iOS (Vorabversion) werden die Methoden und Klassennamen „GMS“ wurde entfernt, und muss entsprechend aktualisiert werden. z.B. GMSFetchPlaceRequest wird zu FetchPlaceRequest.

Typbehandlung

Die neue Methode fetchPlace verwendet eine verbesserte Typverarbeitung. Der alte Code die Rohwerte der Eigenschaft übergeben müssen, erfordert der neue Code keine die Entwickelnden hier explizit Rohwerte abrufen, um so die Zusammenfassung und Lesbarkeit.

Gleichzeitigkeit

Außerdem unterstützt die neue Methode Nebenläufigkeit, sodass die Callback in placesClient.fetchPlace mit einem switch/await-Muster in 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)")
}