從 Places SDK for iOS 遷移至 Places Swift SDK for iOS 的過程應該很簡單,而且可以逐步完成。由於 iOS 適用的 Places Swift SDK 中的結構體與對應的 Objective-C 結構體不相容,建議您根據 GMSPlacesClient 中的 API 用途,遷移個別功能區塊。
將 Places Swift SDK for iOS 新增至專案
如要使用 Places Swift SDK for iOS,請按照下列步驟操作:
- 啟用 Places API (新版)。
將 Places Swift SDK 新增至依附元件。您可以選擇安裝
GooglePlaces
、GooglePlacesSwift
或兩者。使用
PlacesClient
初始化 Places 用戶端。
逐步遷移範例
舉例來說,假設應用程式使用 Places SDK for iOS,根據文字輸入內容收到自動完成建議,然後擷取第一個地點建議的詳細資料。使用 Places SDK for iOS 時,現有程式碼可能如下所示:
// 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 用戶端初始值設定
如要更新程式碼並善用新版 SDK 的功能,您需要將 GMSPlacesClient 替換為 PlacesClient。此外,新方法中的參數名稱已變更,因此您需要將參數更新為 from
,而非 with
。最後,Places Swift SDK 會使用升級後的 AutocompleteRequest。
更新後的程式碼
// Initialize Places Swift Client.
let _ = PlacesClient.provideAPIKey(apiKey)
let placesSwiftClient = PlacesClient.shared
原始代碼
// Initialize Places Client.
GMSPlacesClient.provideAPIKey(apiKey)
let client = GMSPlacesClient.shared()
更新自動完成要求
建議您先更新自動完成要求流程。舊程式碼會使用回呼要求自動完成建議,而新程式碼則採用 switch
/await
模式。回呼可能會讓程式碼結構和錯誤處理變得複雜。新版 Places Swift SDK 支援並行作業,可簡化非同步作業。
// 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))")
}
更新方法和類別名稱
最後,重構 fetchPlace
程式碼,並移除 GMSPlacesClient
初始化和 GMSPlaceProperty
宣告,即可完成遷移作業。在 Places Swift SDK 中,方法和類別名稱已更新,移除了「GMS」前置字元,因此必須相應更新;例如,「GMSFetchPlaceRequest
」變成「FetchPlaceRequest
」。
類型處理
新的 fetchPlace
方法採用改良的型別處理方式。舊版程式碼需要傳遞資源的原始值,但新版程式碼不需要開發人員在此明確擷取原始值,因此更簡潔易讀。
並行
此外,新方法支援並行作業,因此您可以在 placesSwiftClient.fetchPlace
中,以 switch
/await
模式取代 placesClient.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)")
}
跟上最新趨勢
如要瞭解新功能和異動內容,請參閱 Places Swift SDK for iOS 的版本資訊頁面。