Migrasi dari Places SDK for iOS ke Places Swift SDK for iOS seharusnya mudah dan dapat dilakukan secara bertahap. Karena struct di Places Swift SDK for iOS tidak kompatibel dengan struct berbasis Objective-C, sebaiknya migrasikan bagian fungsi diskrit berdasarkan penggunaan API di GMSPlacesClient.
Menambahkan Places Swift SDK for iOS ke project Anda
Langkah-langkah berikut diperlukan untuk menggunakan Places Swift SDK for iOS:
- Aktifkan Places API (Baru).
Tambahkan Places Swift SDK ke dependensi Anda. Anda dapat memilih untuk menginstal
GooglePlaces
,GooglePlacesSwift
, atau keduanya.Lakukan inisialisasi klien Places dengan
PlacesClient
.
Contoh migrasi langkah demi langkah
Sebagai contoh, misalkan aplikasi yang 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))")
}
}
Memperbarui penginisialisasi Places Client
Untuk memodernisasi kode dan memanfaatkan kemampuan SDK baru, Anda
harus mengganti GMSPlacesClient dengan PlacesClient. Selain itu, nama parameter diubah dalam metode baru, jadi Anda harus memperbarui parameter menjadi from
, bukan with
. Terakhir, Places Swift SDK menggunakan
AutocompleteRequest yang telah diupgrade.
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 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 nama metode dan class
Terakhir, selesaikan migrasi dengan merestrukturisasi kode fetchPlace
dan
menghapus inisialisasi GMSPlacesClient
dan deklarasi GMSPlaceProperty
. Di Places Swift SDK, nama metode dan class telah diupdate untuk menghapus awalan "GMS", dan harus diupdate sesuai dengan perubahan tersebut;
misalnya, GMSFetchPlaceRequest
menjadi FetchPlaceRequest
.
Penanganan jenis
Metode fetchPlace
baru menggunakan penanganan jenis yang ditingkatkan. Meskipun kode lama
memerlukan penerusan nilai mentah properti, kode baru tidak mengharuskan
developer mengambil nilai mentah secara eksplisit di sini, sehingga meningkatkan keringkasan dan
keterbacaan.
Serentak
Selain itu, metode baru ini mendukung konkurensi, sehingga 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)")
}
Mendapatkan info terbaru
Buka halaman catatan rilis untuk Places Swift SDK for iOS untuk mempelajari fitur dan perubahan baru.