مهاجرت به 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. کلاینت 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 جایگزین کنید. علاوه بر این، نام پارامترها در روش جدید تغییر می‌کند، بنابراین باید پارامتر را به جای with به‌روزرسانی به from به‌روزرسانی کنید. در نهایت، Places Swift SDK برای iOS (پیش نمایش) از 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 استفاده می کند. فراخوانی می تواند به ساختار کد و رسیدگی به خطاها پیچیدگی بیافزاید. 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 از مدیریت نوع بهبود یافته استفاده می کند. در حالی که کد قدیمی نیاز به ارسال مقادیر خام ویژگی داشت، کد جدید نیازی به توسعه دهندگان ندارد که به صراحت مقادیر خام را در اینجا واکشی کنند، در نتیجه خلاصه و خوانایی را بهبود می بخشد.

همزمانی

علاوه بر این، روش جدید از همزمانی پشتیبانی می‌کند و امکان جایگزینی پاسخ به تماس در 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)")
}