המעבר מ-Places SDK ל-iOS (דור קודם) ל-Places Swift SDK ל-iOS אמור להיות פשוט, ואפשר לבצע אותו בהדרגה. מכיוון שמבני נתונים (structs) ב-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 משתמשת בטיפול משופר בסוגים. בזמן שבקוד הישן היה צריך להעביר את הערכים הגולמיים של הנכס, בקוד החדש המפתחים לא צריכים לאחזר במפורש ערכים גולמיים, וכך הקוד הופך לתמציתי וקריא יותר.
בו-זמניות (concurrency)
בנוסף, השיטה החדשה תומכת בו-זמניות, ומאפשרת להחליף את הקריאה החוזרת (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 אפשר לקרוא על תכונות חדשות ושינויים.