مهاجرت به 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 را به وابستگی های خود اضافه کنید. می‌توانید نصب 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))")
  }
}

راه اندازی کننده Places Client را به روز کنید

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

// 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 دیدن کنید.