העברה אל Places Swift SDK ל-iOS (תצוגה מקדימה)

המעבר מ-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 (גרסת טרום-השקה), צריך לבצע את השלבים הבאים:

  1. מפעילים את Places API (חדש).
  2. מוסיפים את Places Swift SDK ל-iOS (גרסת Preview) ליחסי התלות. אתם יכולים לבחור להתקין את GooglePlaces, את GooglePlacesSwift או את שניהם.

  3. מפעילים את לקוח 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 (גרסת טרום-השקה) תוכלו לקרוא על שינויים ותכונות חדשות.