iOS6でマップアプリを起動する


昨日「iOS6の3D Mapで観光地めぐり」の記事を書いていて気がついたんですが、マップアプリがGoogle製からApple製になったので、Mapの起動方法が変わっています。
今までのソースコードのままだとちょっと動作が違ってくるので注意が必要です。

Safariから起動する場合

まず、Safariから起動する場合。

iOS5までは、htmlファイルからこちらのリンクをよべば、iPhone本体のMapアプリが起動していました。

<a href="http://maps.google.com/maps?q=cupertino">Cupertino</a>

iOS6では、上のリンクは「Safariでhttp://maps.google.com/を開く」動作になってしまいます。
iPhoneのMapアプリを開きたい場合にはこのリンクをつかってください。

<a href="http://maps.apple.com/maps?q=cupertino">Cupertino</a>

このmaps.apple.comのリンクをクリックした時の動作は端末によって違います。
MacのSafariでクリックするとmaps.google.comへリダイレクトされますが、iPhoneのSafariでクリックするとMapアプリが直接起動します。
試してみてください。→ Cupertino

ただ、現実的には、今までのmaps.google.comのリンクをmaps.apple.comのリンクに変更する必要はないと思うんですよね。
モバイル用ウェブでiPhone以外の端末も対象となる場合には、AndroidとiPhoneでリンクをきりわける必要もでてきてしまいますし。
何より、ユーザーにとっては、今のiOSの(かなりできのよくない)Mapアプリを開くより、Safariでmaps.google.comを開いた方が地図の品質はいいですし。
Mac/PCからはどちらのリンクもmaps.google.comにリダイレクトしているので、変更する必要はないですし。

アプリの中でUIWebViewを使っていて、そこから直接Mapアプリを起動する必要がある場合には変更した方がいいかもしれませんね。

Appleの公式の情報はこちらです。
Apple URL Scheme Reference

アプリから起動する場合

さて、アプリから起動する場合。
iOS5までは、こちらでした。

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://maps.google.com/maps?q=cupertino"]];

iOS6からはこうなります。

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://maps.apple.com/maps?q=cupertino"]];

Safariからの起動と同じく、iOS6上で「maps.google.com」で呼び出すとマップアプリではなく、Safariでmaps.google.comが表示されます。

で、このソースをiPhoneで実行してみると……

なんかフィリピンがでてくるんですけど……。

フィリピンにもクパチーノがあるみたいですね。
気をとりなおして、緯度経度をいれて起動。

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://maps.apple.com/maps?ll=37.333278,-122.029672"]];

これなら大丈夫です。

MKMapItem

そして、iOS6からは、さらにMKMapItemを使ったマップアプリの起動もできるようになりました。
(AddressBook.framework、MapKit.framework必須)

MKMapItemのインスタンスを作成して、そこから地図を起動します。

まず、自分の現在の位置の場所を表示する方法。
mapItemForCurrentLocationで現在地のMKMapItemを作成して、そこからopenInMapsWithLaunchOptionsをつかって地図を表示します。

MKMapItem *currentLocItem = [MKMapItem mapItemForCurrentLocation];
NSDictionary* dic = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:MKMapTypeHybrid] forKey:MKLaunchOptionsMapTypeKey];
[currentLocItem openInMapsWithLaunchOptions:dic];

引数に渡すNSDictionaryには、地図を開くときのオプションがいろいろと指定できます。
上の例では、Hybridモードで地図の指定を行っています。

次に特定の場所を表示する方法です。
緯度と経度を指定してMKPlacemarkを作ります。
そして、そのMKPlacemarkからMKMapItemを作って、マップを起動。
MKPlacemarkを作らないといけないのがちょっと面倒くさいですね。

CLLocationCoordinate2D loc;
loc.longitude = 4.842223;
loc.latitude = 45.759723;
NSDictionary* pdic = [NSDictionary dictionaryWithObject:@"Lyon" forKey:(NSString*)kABPersonAddressCityKey];
MKPlacemark* Lyon = [[MKPlacemark alloc] initWithCoordinate:loc addressDictionary:pdic];
MKMapItem* LyonMap = [[MKMapItem alloc] initWithPlacemark:Lyon];
NSDictionary* dic = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:MKMapTypeSatellite] forKey:MKLaunchOptionsMapTypeKey];
[LyonMap openInMapsWithLaunchOptions:dic];

3Dマップの起動

で、ここまでいろいろと調べていたのは、実は3Dマップモードで地図を表示したかったからなんですが、結論からいうと無理みたいです。

まあ、今回のマップアプリの一番の売りの機能なんだから、簡単には使わせてくれないですよね。