Migrer vers le SDK Places Swift pour iOS (preview)

Migrer du SDK Places pour iOS vers Le SDK Places Swift pour iOS (Preview) doit être simple et possible progressivement. Étant donné que les structs du SDK Places Swift pour iOS (Preview) ne sont pas compatible avec leurs homologues basés sur Objective-C, nous vous recommandons de migrer fragments distincts de fonctionnalités basées sur l'utilisation des API dans GMSPlacesClient.

Ajouter le SDK Places Swift pour iOS (bêta) à votre projet

Pour utiliser le SDK Places Swift pour iOS (Preview), procédez comme suit :

  1. Activer l'API Places (Nouveau).
  2. Ajoutez le SDK Places Swift pour iOS (preview) à vos dépendances.
  3. Initialiser le client Places avec PlacesClient

Exemple de migration étape par étape

Par exemple, supposons qu'une application utilise le SDK Places pour iOS reçoit des suggestions de saisie semi-automatique basées sur un texte saisi, puis récupère le les détails de la suggestion de premier lieu. En utilisant SDK Places pour iOS, le code existant peut ressembler comme suit:

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

Mettre à jour l'initialiseur du client Places

Pour moderniser le code et exploiter les fonctionnalités du nouveau SDK, vous allez vous devez remplacer GMSPlacesClient par PlacesClient. De plus, le étant modifiés dans la nouvelle méthode, vous devez mettre à jour sur from au lieu de with. Enfin, la fonction Le SDK Places Swift pour iOS (preview) utilise la version mise à niveau AutocompleteRequest.

Code mis à jour

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

Code d'origine

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

Mettre à jour la requête de saisie semi-automatique

Vous pouvez commencer par mettre à jour le flux de requêtes de saisie semi-automatique. L'ancien code utilise pour demander des suggestions de saisie semi-automatique, tandis que le nouveau code utilise Schéma switch/await. Les rappels peuvent compliquer la structure du code le traitement des erreurs. Le nouveau SDK Places Swift pour iOS (Preview) est compatible avec la simultanéité, ce qui simplifie les opérations asynchrones.

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

Mettre à jour les noms des méthodes et des classes

Enfin, terminez la migration en refactorisant le code fetchPlace et supprimant à la fois l'initialisation GMSPlacesClient et GMSPlaceProperty déclaration. Dans le SDK Places Swift pour iOS (Preview), la méthode et les noms de classe ont été mises à jour pour supprimer doit être mis à jour en conséquence ; Ex. : GMSFetchPlaceRequest devient FetchPlaceRequest.

Gestion des types

La nouvelle méthode fetchPlace utilise une gestion améliorée des types. Alors que l'ancien code nécessite de transmettre les valeurs brutes de la propriété, le nouveau code n'exige pas aux développeurs d'extraire explicitement des valeurs brutes ici, ce qui améliore la concision et la lisibilité.

Simultanéité

De plus, la nouvelle méthode est compatible avec la simultanéité, ce qui permet de remplacer rappel dans placesClient.fetchPlace avec un schéma switch/await dans 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)")
}