המעבר מ-Places SDK ל-iOS ל-Places Swift SDK ל-iOS (גרסת Preview) אמור להיות פשוט וניתן לבצע אותו באופן מצטבר. מאחר שהמבנים (structs) ב-Places Swift SDK ל-iOS (גרסת Preview) לא תואמים למקבילים שלהם שמבוססים על Objective-C, מומלץ להעביר קטעי פונקציונליות נפרדים על סמך שימושים בממשקי API ב-GMSPlacesClient.
הוספת Places Swift SDK ל-iOS (גרסת Preview) לפרויקט
כדי להשתמש ב-Places Swift SDK ל-iOS (גרסת טרום-השקה), צריך לבצע את השלבים הבאים:
- מפעילים את Places API (חדש).
מוסיפים את Places Swift SDK ל-iOS (גרסת Preview) ליחסי התלות. אפשר לבחור להתקין את
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))")
}
}
עדכון של ה-initializer של לקוח Places
כדי לעדכן את הקוד וליהנות מהיכולות של ה-SDK החדש, צריך להחליף את GMSPlacesClient ב-PlacesClient. בנוסף, שמות הפרמטרים השתנו בשיטה החדשה, כך שתצטרכו לעדכן את הפרמטר ל-from
במקום ל-with
. לבסוף, ב-Places Swift SDK ל-iOS (גרסת Preview) נעשה שימוש ב-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 החדש ל-iOS (תצוגה מקדימה) תומך בו-זמניות, שמפשטת פעולות אסינכררוניות.
// 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
ומסירים את ההצהרה GMSPlaceProperty
ואת הקוד לאתחול GMSPlacesClient
. ב-Places Swift SDK ל-iOS (גרסת Preview), השיטה ושמות הכיתות עודכנו כדי להסיר את התחילית '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 (גרסת טרום-השקה) תוכלו לקרוא על שינויים ותכונות חדשות.