مهاجرت به Places Swift SDK برای iOS

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

کیت توسعه نرم‌افزاری iOS مربوط به Places Swift را به پروژه خود اضافه کنید.

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

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