انتقال از «کیت توسعه نرمافزار مکانها، ویژه iOS (قدیمی)» به «کیت توسعه نرمافزار مکانها، ویژه iOS با زبان برنامهنویسی Swift» باید ساده باشد و میتواند بهصورت افزایشی انجام شود. ازآنجاییکه ساختارها در Places Swift SDK برای iOS با همتایان مبتنی بر Objective-C سازگار نیستند، توصیه میکنیم بخشهای مجزای عملکرد را براساس استفاده از میاناهای برنامهسازی کاربردی در GMSPlacesClient انتقال دهید.
افزودن «کیت توسعه نرمافزار مکانها» به زبان Swift برای iOS به پروژه
برای استفاده از Places Swift SDK ویژه iOS، مراحل زیر لازم است:
- Places API (New) را فعال کنید.
Places Swift SDK را به وابستگیهایتان اضافه کنید. میتوانید
GooglePlaces،GooglePlacesSwift، یا هر دو را نصب کنید.کارخواه «مکانها» را با
PlacesClientمقداردهی اولیه کنید.
مثال انتقال گامبهگام
برای مثال، فرض کنید برنامهای که از «کیت توسعه نرمافزار مکانها برای 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))")
}
}
بهروزرسانی مقداردهنده اولیه «مشتری مکانها»
برای مدرنسازی کد و بهرهمندی از قابلیتهای جدید کیت توسعه نرمافزار، باید
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 جدید از همزمانی پشتیبانی میکند،
که عملیاتهای ناهمگام را ساده میکند.
// 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های زیر در «کیت توسعه نرمافزار مکانها» ویژه 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، انتقال را تکمیل کنید. در «کیت توسعه نرمافزار Swift مکانها»، نامهای کلاس و روش
بهروز شدهاند تا پیشوند «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)")
}
به روز باشید
برای آشنایی با ویژگیهای جدید و تغییرات، به صفحه یادداشتهای انتشار برای «کیت توسعه نرمافزار مکانها» در Swift ویژه iOS مراجعه کنید.