Откройте Apple Maps программно

Я хочу открыть приложение Apple Maps в своем собственном приложении Swift, но у меня есть только почтовый индекс, город и улица. У меня НЕТ координат. Я много исследовал, но были только способы с использованием координационной информации.


person Philipp Januskovecz    schedule 18.11.2015    source источник
comment
Вы можете использовать Google Geocoding API для преобразования своего адреса в координаты developers.google.com/maps/ документация/геокодирование/введение   -  person Ollie    schedule 18.11.2015


Ответы (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.
  }
}
person geraldWilliam    schedule 18.11.2015
comment
Вместо использования запятых для разделения слов в строке вы можете использовать %20 вместо пробелов, например, 1600%20Pennsylvania%20Ave.%2020500 будет работать для первого варианта вашего ответа и будет открываться на таких картах, как 1600 Pennsylvania Ave. 20500 - person JCode; 28.06.2016

Свифт 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

person Jonas Deichelmann    schedule 10.12.2018

Использование 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)
            }
        }
    }
}
person rbaldwin    schedule 02.05.2018