プログラムで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を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以下のコードを保持できますifopenMapsWithItems:配列内のアイテムの順序を逆にすると、座標から現在の場所への方向が取得されることに注意しください。MKMapItem現在の場所のマップアイテムの代わりにを作成して渡すことで、2つの場所の間のルートを取得するために使用できます。私はそれを試していません。

最後に、あなたは方向は、作成するためにジオコーダを使用することを(文字列として)アドレスがある場合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 2012年

1
あなたが
トンブクトゥ

+1はiOS 6のみであり、フォールバックが必要であることを言及したこと
Henrik Erlandsson 2013年

2
マップアプリから現在のアプリケーションに移動するにはどうすればよいですか?
Apple

1
Apple Mapsアプリを開いたときに選択した場所で、「これらの場所iOS 6の間に方向が見つかりませんでした」という警告が表示され、その後何も実行されないのはなぜですか。任意のヘルプ
NaXir

80

私自身の質問に対する答えを見つけました。AppleはそのマップURL形式をここに文書化しています。あなたは、本質的に置き換えることができますように見えますmaps.google.commaps.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 2012

@ pir800-iOS 6のSafariでmaps.apple.comへのリンクをタップするとどうなるかと思っていましたが、試してみました。以前のiOSバージョンでタップしたときと同じようにマップに移動しますmaps.google.comへのリンク。ウェブサイトの作成者がマップリンクをmaps.apple.comにポイントするだけで、マップのiOSで機能し、他のすべてのクライアントでは正常に機能するように、彼らがGoogleマップにリダイレクトしているのは良いことだと思います。しかし、すべてのマップリンクをmaps.apple.comを指すように変更する前に、何とかそれを確認したいと思います!
トムハミング

@ pir800-私にとって、ブラウザでmaps.apple.comを開くと、apple.com/ios/maps に移動します。たぶん、私の前のコメントは希望的な考えです。
トムハミング

私はあなたが住所や座標を問い合わせようとするかどうかを意味しました。maps.apple.com/?q=los angeles、ca. デスクトップマシンで開くと、maps.google.comに転送されます
pir800

そのクエリに交通機関モードを追加する方法はありますか?(ウォーキング/運転)。ウェブ上でそれへの参照を見つけることができませんでした。
Lirik 2013

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
OK、それでMKMapItem私が持っているすべてがアドレスであるときにインスタンスを取得する最も簡単な方法は何ですか?このAPIは、その単純なユースケースでは少し複雑に見えます。
トムハミング

MKPlacemark * endLocation = [[MKPlacemark alloc] initWithCoordinate:nil addressDictionary:yourAdressDictHere]; あなたはアドレス
辞書を手渡す

7

maps.apple.comのURL「scheme」が見つかりました。古いデバイスを自動的にmaps.google.comにリダイレクトするため、これは良い選択です。しかし、iOS 6の場合は、活用したい新しいクラスMKMapItemがあります。

興味のある2つの方法:

  1. -openInMapsWithLaunchOptions: -MKMapItemインスタンスで呼び出し、Maps.appで開きます
  2. + openMapsWithItems:launchOptions: -MKMapItemクラスで呼び出し、MKMapItemインスタンスの配列を開きます。

それは便利に見えます。しかし、使用するのも少し複雑に思えます。あなたはに持っているinit MKMapItemMKPlacemarkあなたは緯度/経度のペアとアドレス辞書を提供することにより、取得しました、。開くだけの方が簡単に見えますhttp://maps.apple.com/?q=1+infinite+loop+cupertino+caMKMapItemマップに住所を表示するだけの場合に使用する利点はありますか?
トムハミング

MKMapItem使用したいものへの参照がまだない場合は、初期化する必要はありません。ただ、このクラスのメソッドを使用する+openMapsWithItems:launchOptions:にはMKMapItem、同じことをやって。
マークアダムス

@MarkAdamsは、そのクラスメソッドがクラスのインスタンスの配列を取るので、少なくとも1つは初期化する必要があります。
フィリップラデリック2012

したがって、GPS座標を開くことができるが住所がない場合、MKMapItemAPI を使用すると、「不明な場所」というラベルの付いた地図上にポイントがドロップされます。場所の名前を表示する方法はありますか?アドレス辞書のオプションにこのためのキーが表示されません...
トムハミング

5
@ Mr.Jefferson MKMapItemのnameプロパティを設定します
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ブラウザが開くのが嫌です。

したがって、maps.apple.comへの参照を使用してアプリを開くiOS 5デバイスの場合、手順は次のようになります。

  1. アプリで何かをクリックすると、maps.apple.comのURLが参照されます
  2. サファリはリンクを開きます
  3. maps.apple.comサーバーはmaps.google.com urlにリダイレクトします
  4. maps.google.comのURLが解釈され、Googleマップアプリが開きます。

(非常に明白で混乱する)手順2と3はユーザーにとって煩わしいと思います。したがって、OSのバージョンを確認し、デバイスでmaps.google.comまたはmaps.apple.comを実行します(それぞれ、iOS 5またはiOS 6 OSバージョンの場合)。


それも私がやっていることです。最良のアプローチのようです。
トムハミング、

3

この問題に関する私の研究は、私に次の結論を導きました:

  1. maps.google.comを使用している場合は、すべてのiOSのマップがSafariで開きます。
  2. maps.apple.comを使用すると、iOS 6の地図アプリケーションで地図が開かれ、iOS 5でも機能します。iOS5では、Safariで通常どおり地図を開きます。

3

代わりにGoogleマップを開く(または2番目のオプションとして提供する)場合は、ここに記載されているcomgooglemaps://およびのcomgooglemaps-x-callback://スキームを使用できます。


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.