iOS 6에서 프로그래밍 방식으로지도 앱 열기


159

iOS 6 이전에는 다음과 같이 URL을 열면 (Google)지도 앱이 열립니다.

NSURL *url = [NSURL URLWithString:@"http://maps.google.com/?q=New+York"];
[[UIApplication sharedApplication] openURL:url];

이제 새로운 Apple Maps 구현으로 Mobile Safari to Google Maps가 열립니다. iOS 6에서 동일한 동작을 수행하려면 어떻게해야합니까? 프로그래밍 방식으로지도 앱을 열고 특정 위치 / 주소 / 검색 / 무엇을 가리켜 야합니까?

답변:


281

공식 Apple 방법은 다음과 같습니다.

// Check for iOS 6
Class mapItemClass = [MKMapItem class];
if (mapItemClass && [mapItemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)]) 
{
    // Create an MKMapItem to pass to the Maps app
    CLLocationCoordinate2D coordinate = 
                CLLocationCoordinate2DMake(16.775, -3.009);
    MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:coordinate 
                                            addressDictionary:nil];
    MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
    [mapItem setName:@"My Place"];
    // Pass the map item to the Maps app
    [mapItem openInMapsWithLaunchOptions:nil];
}

당신이 운전 또는 위치에 지침을 걸어 얻을 싶은 경우에, 당신은 포함 할 수 mapItemForCurrentLocationMKMapItem의 배열을 +openMapsWithItems:launchOptions:, 적절하게 실행 옵션을 설정합니다.

// Check for iOS 6
Class mapItemClass = [MKMapItem class];
if (mapItemClass && [mapItemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)]) 
{
    // Create an MKMapItem to pass to the Maps app
    CLLocationCoordinate2D coordinate = 
                CLLocationCoordinate2DMake(16.775, -3.009);
    MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:coordinate 
                                            addressDictionary:nil];
    MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
    [mapItem setName:@"My Place"];

    // Set the directions mode to "Walking"
    // Can use MKLaunchOptionsDirectionsModeDriving instead
    NSDictionary *launchOptions = @{MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeWalking};
    // Get the "Current User Location" MKMapItem
    MKMapItem *currentLocationMapItem = [MKMapItem mapItemForCurrentLocation];
    // Pass the current location and destination map items to the Maps app
    // Set the direction mode in the launchOptions dictionary
    [MKMapItem openMapsWithItems:@[currentLocationMapItem, mapItem] 
                    launchOptions:launchOptions];
}

else그 이후 의 문장 에서 원래 iOS 5 이하 코드를 보존 할 수 있습니다 if. openMapsWithItems:배열 의 항목 순서를 반대로 하면 좌표 에서 현재 위치 까지 의 경로가 표시됩니다. MKMapItem현재 위치 맵 항목 대신 생성 된 항목 을 전달하여 두 위치 간 경로를 얻는 데 사용할 수 있습니다 . 나는 그것을 시도하지 않았습니다.

당신이가는 길을 원하는 (문자열로) 주소가있는 경우 마지막으로,를 만들 지오 코더를 사용하는 MKPlacemark방식으로, CLPlacemark.

// Check for iOS 6
Class mapItemClass = [MKMapItem class];
if (mapItemClass && [mapItemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)])
{
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder geocodeAddressString:@"Piccadilly Circus, London, UK" 
        completionHandler:^(NSArray *placemarks, NSError *error) {

        // Convert the CLPlacemark to an MKPlacemark
        // Note: There's no error checking for a failed geocode
        CLPlacemark *geocodedPlacemark = [placemarks objectAtIndex:0];
        MKPlacemark *placemark = [[MKPlacemark alloc]
                                  initWithCoordinate:geocodedPlacemark.location.coordinate
                                  addressDictionary:geocodedPlacemark.addressDictionary];

        // Create a map item for the geocoded address to pass to Maps app
        MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
        [mapItem setName:geocodedPlacemark.name];

        // Set the directions mode to "Driving"
        // Can use MKLaunchOptionsDirectionsModeWalking instead
        NSDictionary *launchOptions = @{MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeDriving};

        // Get the "Current User Location" MKMapItem
        MKMapItem *currentLocationMapItem = [MKMapItem mapItemForCurrentLocation];

        // Pass the current location and destination map items to the Maps app
        // Set the direction mode in the launchOptions dictionary
        [MKMapItem openMapsWithItems:@[currentLocationMapItem, mapItem] launchOptions:launchOptions];

    }];
}

이 코드는 iOS 6에서 훌륭하게 작동합니다. 원하는 경로가 현재 사용자 위치에서 목적지까지라면 전달할 필요가 없습니다 currentLocationMapItem.
Philip007

1
당신은 톰 부토 좌표를 사용한다는 사실은 : 더 나은 답을한다
sachadso

iOS 6 전용이며

2
지도 앱에서 현재 애플리케이션으로 어떻게 이동합니까?
Apple

1
애플 맵 앱을 열 때 내가 선택한 위치는 "이 위치 사이에 길을 찾을 수 없습니다"라는 경고를 표시하고 아무것도하지 않습니까? 어떤 도움
NaXir

80

내 질문에 대한 답을 찾았습니다. Apple은지도 URL 형식을 여기에 문서화합니다 . 당신은 본질적으로 대체 할 수있는 것 같습니다 maps.google.com과 함께 maps.apple.com.

업데이트 : iOS 6의 MobileSafari에서도 마찬가지입니다. 링크를 http://maps.apple.com/?q=...누르면 http://maps.google.com/?q=...이전 버전 과 같은 방식으로 해당 검색으로지도 앱이 열립니다 . 이것은 작동하며 위에 링크 된 페이지에 설명되어 있습니다.

업데이트 : 이것은 URL 형식과 관련된 내 질문에 대답합니다. 그러나 여기 Nevan King의 답변 (아래 참조)은 실제 Maps API에 대한 훌륭한 요약입니다.


1
흥미 롭군 maps.apple.com에 브라우저를 열면 maps.google.com으로 리디렉션됩니다. 이것이 얼마나 오래 지속 될지 궁금합니다.
pir800

@ pir800-iOS 6의 Safari에서 maps.apple.com에 대한 링크를 탭하면 실제로 어떤 일이 발생할지 궁금합니다. 시도했지만 이전 iOS 버전에서와 동일한 방식으로 맵으로 이동합니다 maps.google.com에 대한 링크 웹 사이트 제작자가 maps.apple.com에 대한지도 링크를 가리키고지도의 iOS에서는 작동하지만 다른 모든 클라이언트에서는 정상적으로 작동 할 수 있도록 Google지도로 리디렉션하는 것이 좋습니다. 그러나 모든지도 링크를 maps.apple.com을 가리 키도록 변경하기 전에 어떻게 든 확인하고 싶습니다!
Tom Hamming

@ pir800- 브라우저에서 maps.apple.com 을 열면 apple.com/ios/maps로 이동 합니다. 어쩌면 내 이전 의견은 희망적 인 생각 일 것입니다.
Tom Hamming

주소 또는 좌표를 쿼리하려고하면 의미합니다. maps.apple.com/?q=los angeles, ca. 데스크톱 컴퓨터에서 열 수 있으며 maps.google.com으로 이동합니다.
pir800

해당 검색어에 대중 교통 모드를 추가하는 방법이 있습니까? (도보 / 운전). 웹에서 참조를 찾을 수 없습니다.
Lirik

41

가장 좋은 방법은 새로운 iOS 6 메소드를 호출하는 것입니다. MKMapItem openInMapsWithLaunchOptions:launchOptions

예:

CLLocationCoordinate2D endingCoord = CLLocationCoordinate2DMake(40.446947, -102.047607);
MKPlacemark *endLocation = [[MKPlacemark alloc] initWithCoordinate:endingCoord addressDictionary:nil];
MKMapItem *endingItem = [[MKMapItem alloc] initWithPlacemark:endLocation];

NSMutableDictionary *launchOptions = [[NSMutableDictionary alloc] init];
[launchOptions setObject:MKLaunchOptionsDirectionsModeDriving forKey:MKLaunchOptionsDirectionsModeKey];

[endingItem openInMapsWithLaunchOptions:launchOptions];

현재 위치에서 운전하기위한 탐색이 시작됩니다.


1
그렇다면 MKMapItem내가 가진 모든 것이 주소 일 때 인스턴스를 얻는 가장 쉬운 방법은 무엇 입니까? 이 API는 간단한 사용 사례에 약간 복잡해 보입니다.
Tom Hamming

MKPlacemark * endLocation = [[MKPlacemark alloc] initWithCoordinate : nil addressDictionary : yourAdressDictHere]; 당신은
dictonary에

7

maps.apple.com URL "scheme"을 찾았습니다. 이전 기기를 maps.google.com으로 자동 리디렉션하므로 선택하는 것이 좋습니다. 그러나 iOS 6의 경우 MKMapItem 을 활용할 수있는 새로운 클래스가 있습니다 .

관심있는 두 가지 방법 :

  1. -openInMapsWithLaunchOptions : -MKMapItem 인스턴스에서 호출하여 Maps.app에서 엽니 다.
  2. + openMapsWithItems : launchOptions : -MKMapItem 클래스에서 호출하여 MKMapItem 인스턴스 배열을 엽니 다.

유용 해 보입니다. 그러나 사용하기가 조금 더 복잡해 보입니다. 당신은에있는 init MKMapItemMKPlacemark당신은 위도 / 경도 쌍 주소 사전을 제공함으로써 얻을 수있는. 그냥 여는 것이 더 간단한 것 같습니다 http://maps.apple.com/?q=1+infinite+loop+cupertino+ca. MKMapItem지도에 주소를 표시하기 만하면 사용할 때 이점이 있습니까?
Tom Hamming

MKMapItem사용할 참조에 대한 참조가 없으면 초기화 할 필요가 없습니다. 다만, 클래스 메소드를 사용 +openMapsWithItems:launchOptions:MKMapItem같은 일을 할 수 있습니다.
Mark Adams

@MarkAdams는 클래스 메소드가 클래스 인스턴스의 배열을 취하므로 적어도 하나는 초기화해야합니다.
Filip Radelic

따라서 GPS 좌표가 열려 있지만 주소가없는 상황에서 MKMapItemAPI를 사용하고 "알 수없는 위치"라는 레이블이 붙은지도에 점을 놓습니다. 위치 이름을 표시하는 방법이 있습니까? 주소 사전에 대한 옵션에서 이것에 대한 키가 보이지 않습니다 ...
Tom Hamming

5
@ Mr.Jefferson MKMapItem의 이름 속성 설정
matt

5

다음은 Swift에서 완성 된 nevan king의 솔루션을 사용하는 클래스입니다.

class func openMapWithCoordinates(theLon:String, theLat:String){

            var coordinate = CLLocationCoordinate2DMake(CLLocationDegrees(theLon), CLLocationDegrees(theLat))

            var placemark:MKPlacemark = MKPlacemark(coordinate: coordinate, addressDictionary:nil)

            var mapItem:MKMapItem = MKMapItem(placemark: placemark)

            mapItem.name = "Target location"

            let launchOptions:NSDictionary = NSDictionary(object: MKLaunchOptionsDirectionsModeDriving, forKey: MKLaunchOptionsDirectionsModeKey)

            var currentLocationMapItem:MKMapItem = MKMapItem.mapItemForCurrentLocation()

            MKMapItem.openMapsWithItems([currentLocationMapItem, mapItem], launchOptions: launchOptions)
}

4

http://maps.apple.com?q= ... 링크 설정 을 사용하면 구형 장치에서 먼저 Safari 브라우저가 열립니다.

따라서 iOS 5 기기의 경우 maps.apple.com에 대한 참조로 앱을 여는 단계는 다음과 같습니다.

  1. 앱에서 무언가를 클릭하면 maps.apple.com URL을 나타냅니다.
  2. 사파리는 링크를 엽니 다
  3. maps.apple.com 서버가 maps.google.com URL로 리디렉션됩니다.
  4. maps.google.com URL이 해석되고 Google Maps 앱이 열립니다.

나는 (매우 명백하고 혼란스러운) 2 단계와 3 단계는 사용자에게 성가신 것이라고 생각합니다. 따라서 OS 버전을 확인하고 기기에서 maps.google.com 또는 maps.apple.com을 실행합니다 (ios 5 또는 ios 6 OS 버전).


저도 그렇게하고 있습니다. 가장 좋은 방법처럼 보입니다.
Tom Hamming

3

이 문제에 대한 나의 연구는 다음과 같은 결론으로 ​​이어졌습니다.

  1. maps.google.com을 사용하면 모든 iOS에 대해 사파리에서지도가 열립니다.
  2. maps.apple.com을 사용하면 ios 6의지도 응용 프로그램에서지도가 열리고 ios 5에서도 잘 작동하며 ios 5에서는 사파리에서 정상적으로지도가 열립니다.

3

대신 Google지도를 열려면 (또는 보조 옵션으로 제공하려는 경우) 여기에 설명 된 comgooglemaps://comgooglemaps-x-callback://URL 체계를 사용할 수 있습니다 .


3

URL을 시작하기 전에 URL에서 특수 문자를 제거하고 공백을 +로 바꾸십시오. 이렇게하면 두통이 줄어 듭니다.

    NSString *mapURLStr = [NSString stringWithFormat: @"http://maps.apple.com/?q=%@",@"Limmattalstrasse 170, 8049 Zürich"];

    mapURLStr = [mapURLStr stringByReplacingOccurrencesOfString:@" " withString:@"+"];
    NSURL *url = [NSURL URLWithString:[mapURLStr stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]];
    if ([[UIApplication sharedApplication] canOpenURL:url]){
            [[UIApplication sharedApplication] openURL:url];
        }

2
NSString *address = [NSString stringWithFormat:@"%@ %@ %@ %@"
                             ,[dataDictionary objectForKey:@"practice_address"]
                             ,[dataDictionary objectForKey:@"practice_city"]
                             ,[dataDictionary objectForKey:@"practice_state"]
                             ,[dataDictionary objectForKey:@"practice_zipcode"]];


        NSString *mapAddress = [@"http://maps.apple.com/?q=" stringByAppendingString:[address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

        NSLog(@"Map Address %@",mapAddress);

        [objSpineCustomProtocol setUserDefaults:mapAddress :@"webSiteToLoad"];

        [self performSegueWithIdentifier: @"provider_to_web_loader_segue" sender: self];

// VKJ


2

@PJeremyMalouf의 답변에 따라 Swift 4로 업데이트되었습니다.

private func navigateUsingAppleMaps(to coords:CLLocation, locationName: String? = nil) {
    let placemark = MKPlacemark(coordinate: coords.coordinate, addressDictionary:nil)
    let mapItem = MKMapItem(placemark: placemark)
    mapItem.name = locationName
    let launchOptions = [MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving]
    let currentLocationMapItem = MKMapItem.forCurrentLocation()

    MKMapItem.openMaps(with: [currentLocationMapItem, mapItem], launchOptions: launchOptions)
}

1

프로그래밍 방식으로 UiButton 액션을 사용하는 맵을 사용하지 않는 것이 나에게 효과적이었습니다.

// Button triggers the map to be presented.

@IBAction func toMapButton(sender: AnyObject) {

//Empty container for the value

var addressToLinkTo = ""

//Fill the container with an address

self.addressToLinkTo = "http://maps.apple.com/?q=111 Some place drive, Oak Ridge TN 37830"

self.addressToLinkTo = self.addressToLinkTo.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!

let url = NSURL(string: self.addressToLinkTo)
UIApplication.sharedApplication().openURL(url!)

                }

이 코드 중 일부를 약간 확산시킬 수 있습니다. 예를 들어 변수를 클래스 수준 변수로 넣고 다른 함수를 채우고 버튼을 누르면 변수에있는 것을 가져 와서 URL에 사용하도록 문지릅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.