Migrer vers le SDK Places Swift pour iOS (preview)

La migration du SDK Places pour iOS vers le SDK Places Swift pour iOS (bêta) devrait être simple et peut être effectuée de manière incrémentielle. Étant donné que les structures du SDK Places Swift pour iOS (Preview) ne sont pas compatibles avec leurs homologues basées sur Objective-C, nous vous recommandons de migrer des blocs de fonctionnalités distincts en fonction des utilisations des API dans GMSPlacesClient.

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

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

  1. Activez l'API Places (nouvelle version).
  2. Ajoutez le SDK Places Swift pour iOS (bêta) à vos dépendances. Vous pouvez choisir d'installer GooglePlaces, GooglePlacesSwift ou les deux.

  3. Initialisez le client Places avec PlacesClient.

Exemple de migration par étapes

Par exemple, supposons qu'une application utilisant le SDK Places pour iOS reçoive des suggestions de saisie semi-automatique basées sur une saisie de texte, puis récupère les informations de la première suggestion de lieu. Avec le SDK Places pour iOS, le code existant peut ressembler à ceci:

// 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 profiter des fonctionnalités du nouveau SDK, vous devez remplacer GMSPlacesClient par PlacesClient. De plus, les noms des paramètres sont modifiés dans la nouvelle méthode. Vous devrez donc remplacer le paramètre par from au lieu de with. Enfin, le SDK Swift Places pour iOS (version preview) utilise la version mise à niveau d'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()

Modifier 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 un rappel pour demander des suggestions de saisie semi-automatique, tandis que le nouveau code utilise un modèle switch/await. Les rappels peuvent complexifier la structure du code et la gestion des erreurs. Le nouveau SDK Swift Places 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))")
}

Modifier les noms de méthode et de classe

Enfin, finalisez la migration en refactorisant le code fetchPlace et en supprimant à la fois l'initialisation GMSPlacesClient et la déclaration GMSPlaceProperty. Dans le SDK Swift Places pour iOS (Preview), la méthode et les noms de classe ont été mis à jour pour supprimer le préfixe "GMS" et doivent être mis à jour en conséquence. Par exemple : 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écessitait de transmettre les valeurs brutes de la propriété, le nouveau code ne nécessite pas que les développeurs récupèrent explicitement les valeurs brutes ici, ce qui améliore la concision et la lisibilité.

Simultanéité

De plus, la nouvelle méthode est compatible avec la concurrence, ce qui permet de remplacer le rappel dans placesClient.fetchPlace par un modèle 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)")
}

Rester informé

Consultez la page des notes de version du SDK Places Swift pour iOS (Preview) pour en savoir plus sur les nouvelles fonctionnalités et les modifications.