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

מעבר מ-Places SDK ל-iOS אל Places Swift SDK ל-iOS (גרסת טרום-השקה) צריכה להיות פשוטה ואפשר לבצע אותה בהדרגה. מכיוון שמבנים ב-Places Swift SDK ל-iOS (גרסת טרום-השקה) לא שתואמים למודלים המקבילים שמבוססים על Objective-C, מומלץ לבצע העברה קטעי פונקציונליות נפרדים על סמך שימושים בממשקי API ב-GMSPlacesClient.

הוספה של Places Swift SDK ל-iOS (תצוגה מקדימה) לפרויקט

כדי להשתמש ב-Places Swift SDK ל-iOS (תצוגה מקדימה), צריך לבצע את השלבים הבאים:

  1. הפעלת Places API (חדש).
  2. מוסיפים את Places Swift SDK ל-iOS (תצוגה מקדימה) ליחסי התלות שלכם.
  3. אתחול הלקוח של 'מקומות' עם 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))")
  }
}

עדכון מאתחל הלקוח של מקומות

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

עדכון הבקשה להשלמה אוטומטית

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