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