У меня есть код, который может запрашивать близлежащие местоположения на основе некоторой строки запроса. Поиск конкретного ресторана или места даст результаты в формате ниже. Например, если я ищу ресторан, как я могу получить дополнительную информацию о его местоположении, например изображение, часы работы и т. д.? Есть ли способ использовать для этого какой-нибудь собственный Swift API? Или использование API карт Google является следующей лучшей альтернативой?
<MKMapItem: 0x301095d00> {
isCurrentLocation = 0;
name = "Chick-fil-A";
phoneNumber = "+1 (707) 421-9631";
placemark = "Chick-fil-A, 1750 Travis Blvd, Fairfield, CA 94533, United States @ <+38.25884980,-122.05986700> +/- 0.00m, region CLCircularRegion (identifier:'<+38.25884981,-122.05986700> radius 141.17', center:<+38.25884981,-122.05986700>, radius:141.17m)";
timeZone = "America/Los_Angeles (PDT) offset -25200 (Daylight)";
url = "https://www.chick-fil-a.com/locations/ca/fairfield-in-line-dt";}
import MapKit
import CoreLocation
class AddressSearchViewModel: NSObject, ObservableObject, MKLocalSearchCompleterDelegate {
@Published var searchResults: [searchLoc] = []
@Published var searching: Bool = false
private var searchCompleter: MKLocalSearchCompleter!
override init() {
super.init()
searchCompleter = MKLocalSearchCompleter()
searchCompleter.delegate = self
searchCompleter.resultTypes = [.address, .pointOfInterest]
}
func completerDidUpdateResults(_ completer: MKLocalSearchCompleter) {
getCityList(results: completer.results) { cityResults in
DispatchQueue.main.async {
self.searching = false
cityResults.forEach { element in
if !self.searchResults.contains(where: { $0.searchName == element.searchName }) {
self.searchResults.insert(element, at: 0)
}
}
}
}
}
func completer(_ completer: MKLocalSearchCompleter, didFailWithError error: Error) { }
func performSearch(queryStr: String) {
searching = true
self.searchCompleter.queryFragment = queryStr
}
private func getCityList(results: [MKLocalSearchCompletion], completion: @escaping ([searchLoc]) -> Void) {
var searchTemp: [searchLoc] = []
let dispatchGroup = DispatchGroup()
for result in results {
dispatchGroup.enter()
let request = MKLocalSearch.Request(completion: result)
let search = MKLocalSearch(request: request)
search.start { (response, error) in
defer {
dispatchGroup.leave()
}
guard let response = response else { return }
for item in response.mapItems {
if let name = item.name {
searchTemp.append(searchLoc(searchName: name, lat: item.placemark.coordinate.latitude, long: item.placemark.coordinate.longitude))
}
}
}
}
dispatchGroup.notify(queue: .main) {
completion(searchTemp)
}
}
}
У Apple нет API, который бы предоставлял вам такие данные, как часы работы и изображения, вплоть до iOS 18.
Если вам этого достаточно, начиная с iOS 18, у Apple есть API для отображения изображений, часов открытия и многого другого пользователю: см. https://developer.apple.com/wwdc24/10097 по временной метке 6:12.
Имейте в виду, что эту информацию видит только пользователь, вы, как разработчик приложения, не получаете данные, поэтому у вас нет возможности смешивать эти данные с вашими собственными данными.
И в каждом из этих представлений есть ссылка на приложение Apple Maps, которая побуждает пользователя покинуть приложение и перейти в приложение Apples Maps.
Google: очень внимательно читайте условия лицензии: для некоторых данных Google разрешает отображать данные Google только на Google Maps и нигде больше. А за пределами Android Google хочет денег.
Если вам нужно больше, вам придется искать эти данные где-то еще. Это было бы слишком широко для ответа на Stackoverflow.