המעבר מ-Places SDK ל-iOS (דור קודם) ל-Places Swift SDK ל-iOS אמור להיות פשוט, ואפשר לבצע אותו בהדרגה. מכיוון שהמבנים ב-Places Swift SDK ל-iOS לא תואמים למבנים המקבילים שמבוססים על Objective-C, מומלץ להעביר מקטעים נפרדים של פונקציונליות על סמך השימושים בממשקי ה-API ב-GMSPlacesClient.
הוספת Places Swift SDK ל-iOS לפרויקט
כדי להשתמש ב-Places Swift SDK ל-iOS, צריך לבצע את השלבים הבאים:
- מפעילים את Places API (חדש).
מוסיפים את Places Swift SDK ליחסי התלות. אתם יכולים להתקין את
GooglePlaces, אתGooglePlacesSwiftאו את שניהם.מאתחלים את הלקוח של Places באמצעות
PlacesClient.
דוגמה להעברה שלב אחר שלב
לדוגמה, נניח שאפליקציה שמשתמשת ב-Places SDK ל-iOS מקבלת הצעות של ההשלמה האוטומטית על סמך קלט טקסט, ואז מאחזרת את הפרטים של ההצעה הראשונה למקום. אם משתמשים ב-Places SDK ל-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 Client
כדי לעדכן את הקוד ולהשתמש ביכולות של ה-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()
עדכון הבקשה להשלמה אוטומטית
אפשר להתחיל בעדכון של תהליך הבקשה להשלמה אוטומטית. הקוד הישן משתמש בקריאה חוזרת (callback) כדי לבקש הצעות של ההשלמה האוטומטית, והקוד החדש משתמש בתבנית 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))")
}
החלפת מחלקות, שיטות ו-typedefs שהוצאו משימוש
המחלקות, ה-methods וה-typedefs הבאים ב-Places SDK ל-iOS לא זמינים יותר בגרסה 11.0 ואילך.
בטבלה הבאה מוצגות השיטות שהוצאו משימוש והשיטות שמחליפות אותן:
| הוצא משימוש | החלפה |
|---|---|
currentPlaceWithCallback או findPlaceLikelihoodsFromCurrentLocationWithPlaceFields |
searchNearbyWithRequest |
lookUpPlaceID או fetchPlaceFromPlaceID |
fetchPlaceWithRequest |
lookUpPhotosForPlaceID או loadPlacePhoto |
fetchPhotoWithRequest |
GMSAutocompletePrediction |
AutocompleteSuggestion |
findAutocompletePredictionsFromQuery או GMSAutocompleteFetcher |
fetchAutocompleteSuggestionsFromRequest |
isOpenWithPlaceID או isOpenWithPlace |
isOpenWithRequest |
GMSAutocompleteResultsViewController, GMSAutocompleteTableDataSource או GMSAutocompleteViewController |
placeAutocomplete |
עדכון שמות של שיטות ומחלקות
בסיום, משלימים את ההעברה על ידי שכתוב הקוד של fetchPlace והסרת ההפעלה של GMSPlacesClient וההצהרה של GMSPlaceProperty. ב-Places Swift SDK, שמות השיטות והמחלקות עודכנו והוסרה מהם התחילית "GMS", וצריך לעדכן אותם בהתאם. לדוגמה, GMSFetchPlaceRequest הופך ל-FetchPlaceRequest.
טיפול בסוגים
השיטה החדשה fetchPlace משתמשת בטיפול משופר בסוגים. בקוד הישן היה צריך להעביר את הערכים הגולמיים של המאפיין, אבל בקוד החדש המפתחים לא צריכים לאחזר במפורש את הערכים הגולמיים, וכך הקוד קצר וקריא יותר.
בו-זמניות
בנוסף, השיטה החדשה תומכת בו-זמניות, ומאפשרת להחליף את הקריאה החוזרת (callback) ב-placesClient.fetchPlace בתבנית switch/await ב-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)")
}
הישארו מעודכנים
בדף נתוני הגרסה של Places Swift SDK ל-iOS מפורט מידע על תכונות חדשות ושינויים.