Bermigrasi ke Places Swift SDK for iOS (Pratinjau)

Bermigrasi dari Places SDK for iOS ke Places Swift SDK for iOS (Pratinjau) harus mudah dan dapat dilakukan secara bertahap. Karena struct di Places Swift SDK for iOS (Pratinjau) tidak kompatibel dengan partner berbasis Objective-C, sebaiknya migrasikan potongan fungsi terpisah berdasarkan penggunaan API di GMSPlacesClient.

Menambahkan Places Swift SDK for iOS (Pratinjau) ke project Anda

Langkah-langkah berikut diperlukan untuk menggunakan Places Swift SDK for iOS (Pratinjau):

  1. Mengaktifkan Places API (Baru).
  2. Tambahkan Places Swift SDK for iOS (Pratinjau) pada dependensi Anda.
  3. Melakukan inisialisasi klien Places dengan PlacesClient

Contoh migrasi langkah demi langkah

Sebagai contoh, misalkan sebuah aplikasi menggunakan Places SDK for iOS menerima saran pelengkapan otomatis berdasarkan input teks, lalu mengambil detail saran tempat pertama. Dengan menggunakan Places SDK for iOS, kode yang ada mungkin terlihat seperti berikut:

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

Mengupdate penginisialisasi Places Client

Untuk memodernisasi kode dan memanfaatkan kemampuan SDK baru, Anda harus perlu mengganti GMSPlacesClient dengan PlacesClient. Selain itu, diubah dalam metode baru, jadi Anda harus memperbarui ke from, bukan with. Terakhir, Places Swift SDK for iOS (Pratinjau) menggunakan versi yang telah diupgrade AutocompleteRequest.

Kode yang diperbarui

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

Kode asli

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

Memperbarui permintaan pelengkapan otomatis

Anda dapat memulai dengan memperbarui alur permintaan pelengkapan otomatis. Kode lama menggunakan callback untuk meminta saran pelengkapan otomatis, sedangkan kode baru menggunakan pola switch/await. Callback dapat menambah kompleksitas pada struktur kode dan penanganan error. Places Swift SDK for iOS (Pratinjau) baru mendukung konkurensi, yang menyederhanakan operasi asinkron.

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

Memperbarui metode dan nama class

Terakhir, selesaikan migrasi dengan memfaktorkan ulang kode fetchPlace dan menghapus inisialisasi GMSPlacesClient dan GMSPlaceProperty deklarasi. Di Places Swift SDK for iOS (Pratinjau), metode dan nama class telah diperbarui untuk menghapus "GMS" , dan harus diperbarui sebagaimana mestinya; misalnya, GMSFetchPlaceRequest menjadi FetchPlaceRequest.

Penanganan jenis

Metode fetchPlace baru menggunakan penanganan jenis yang lebih baik. Sementara kode lama wajib meneruskan nilai mentah properti, kode baru tidak memerlukan pengembang untuk secara eksplisit mengambil nilai mentah di sini, sehingga meningkatkan keterbacaan.

Serentak

Selain itu, metode baru ini mendukung konkurensi, yang memungkinkan penggantian callback di placesClient.fetchPlace dengan pola switch/await di 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)")
}