انتقال به کیت توسعه نرم‌افزار مکان‌ها Swift برای iOS

انتقال از Places SDK for iOS (Legacy) به Places Swift SDK for iOS باید ساده باشد و می‌تواند به‌صورت افزایشی انجام شود. ازآنجایی‌که ساختارها در Places Swift SDK برای iOS با همتایان مبتنی بر Objective-C خود سازگار نیستند، توصیه می‌کنیم بخش‌های مجزای عملکرد را براساس استفاده از APIها در GMSPlacesClient منتقل کنید.

افزودن Places Swift SDK ویژه iOS به پروژه

برای استفاده از Places Swift SDK ویژه iOS، مراحل زیر لازم است:

  1. Places API (New) را فعال کنید.
  2. Places Swift SDK را به وابستگی‌هایتان اضافه کنید. می‌توانید GooglePlaces، GooglePlacesSwift، یا هر دو را نصب کنید.

  3. مقداردهی اولیه مشتری Places با PlacesClient.

نمونه انتقال گام‌به‌گام

به‌عنوان مثال، فرض کنید برنامه‌ای که از Places SDK for iOS استفاده می‌کند، پیشنهادهای تکمیل خودکار را براساس ورودی نوشتاری دریافت می‌کند، سپس جزئیات اولین مکان پیشنهادی را واکشی می‌کند. بااستفاده از کیت توسعه نرم‌افزار مکان‌ها برای 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

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

// 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))")
}

جایگزین کردن کلاس‌ها، روش‌ها، و typedefهای منسوخ‌شده

کلاس‌ها، روش‌ها، و typedefهای زیر در Places SDK for iOS دیگر در نسخه ۱۱.۰ و بالاتر دردسترس نیستند.

این جدول روش‌های منسوخ‌شده و جایگزین‌های آن‌ها را نشان می‌دهد:

منسوخ جایگزین
‫currentPlaceWithCallback یا findPlaceLikelihoodsFromCurrentLocationWithPlaceFields searchNearbyWithRequest
‫lookUpPlaceID یا fetchPlaceFromPlaceID fetchPlaceWithRequest
‫lookUpPhotosForPlaceID یا loadPlacePhoto fetchPhotoWithRequest
GMSAutocompletePrediction AutocompleteSuggestion
‫findAutocompletePredictionsFromQuery یا GMSAutocompleteFetcher fetchAutocompleteSuggestionsFromRequest
‫isOpenWithPlaceID یا isOpenWithPlace isOpenWithRequest
‫GMSAutocompleteResultsViewController، GMSAutocompleteTableDataSource، یا GMSAutocompleteViewController placeAutocomplete

به‌روزرسانی نام کلاس و روش

درنهایت، انتقال را با بازسازی کد 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 for iOS مراجعه کنید.