Я хочу открыть приложение Apple Maps в своем собственном приложении Swift, но у меня есть только почтовый индекс, город и улица. У меня НЕТ координат. Я много исследовал, но были только способы с использованием координационной информации.
Откройте Apple Maps программно
Ответы (3)
Вы можете просто передать информацию о своем адресе в качестве параметров URL-адреса в URL-адресе, с которым вы открываете приложение карт. Допустим, вы хотели, чтобы приложение «Карты» открывалось по центру Белого дома.
UIApplication.sharedApplication().openURL(NSURL(string: "http://maps.apple.com/?address=1600,PennsylvaniaAve.,20500")!)
Приложение «Карты» открывается с уродливой строкой запроса в поле поиска, но показывает правильное местоположение. Обратите внимание, что город и штат отсутствуют в поисковом запросе, это просто адрес и почтовый индекс.
Потенциально лучшим подходом, в зависимости от ваших потребностей, было бы получение CLLocation имеющейся у вас адресной информации с помощью CLGeocoder.
let geocoder = CLGeocoder()
let str = "1600 Pennsylvania Ave. 20500" // A string of the address info you already have
geocoder.geocodeAddressString(str) { (placemarksOptional, error) -> Void in
if let placemarks = placemarksOptional {
print("placemark| \(placemarks.first)")
if let location = placemarks.first?.location {
let query = "?ll=\(location.coordinate.latitude),\(location.coordinate.longitude)"
let path = "http://maps.apple.com/" + query
if let url = NSURL(string: path) {
UIApplication.sharedApplication().openURL(url)
} else {
// Could not construct url. Handle error.
}
} else {
// Could not get a location from the geocode request. Handle error.
}
} else {
// Didn't get any placemarks. Handle error.
}
}
Свифт 4 и выше
Используйте эту версию, чтобы получить координаты для адреса, также есть способ открыть его напрямую с адресом, но это подвержено ошибкам.
import CoreLocation
let myAddress = "One,Apple+Park+Way,Cupertino,CA,95014,USA"
let geoCoder = CLGeocoder()
geoCoder.geocodeAddressString(myAddress) { (placemarks, error) in
guard let placemarks = placemarks?.first else { return }
let location = placemarks.location?.coordinate ?? CLLocationCoordinate2D()
guard let url = URL(string:"http://maps.apple.com/?daddr=\(location.latitude),\(location.longitude)") else { return }
UIApplication.shared.open(url)
}
У Apple есть документация о схеме URL-адреса карты. Посмотрите здесь: https://developer.apple.com/library/archive/featuredarticles/iPhoneURLScheme_Reference/MapLinks/MapLinks.html#//apple_ref/doc/uid/TP40007899-CH5-SW1
Использование Swift 4 и Xcode 9
Наверху:
import CoreLocation
Затем:
let geocoder = CLGeocoder()
let locationString = "London"
geocoder.geocodeAddressString(locationString) { (placemarks, error) in
if let error = error {
print(error.localizedDescription)
} else {
if let location = placemarks?.first?.location {
let query = "?ll=\(location.coordinate.latitude),\(location.coordinate.longitude)"
let urlString = "http://maps.apple.com/".appending(query)
if let url = URL(string: urlString) {
UIApplication.shared.open(url, options: [:], completionHandler: nil)
}
}
}
}