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で同じ動作を実現するにはどうすればよいですか? Mapsアプリをプログラムで開き、特定の場所/住所/検索/その他を指定するにはどうすればよいですか?
私自身の質問に対する答えを見つけました。 Appleは、マップのURL形式を文書化します here 。基本的にmaps.google.com
をmaps.Apple.com
に置き換えることができるようです。
更新: iOS 6のMobileSafariでも同じことが言えます。 http://maps.Apple.com/?q=...
へのリンクをタップすると、以前のバージョンでhttp://maps.google.com/?q=...
が行ったのと同じように、その検索でマップアプリが開きます。これは機能し、上記のリンクページに記載されています。
更新:これは、URL形式に関する私の質問に答えます。しかし、ネヴァンキングの答え ここ (下記参照)は、実際のMaps APIの優れた要約です。
公式の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];
}
その場所への運転または歩行の指示を取得したい場合は、mapItemForCurrentLocation
をMKMapItem
とともに+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];
}
元のiOS 5以下のコードをelse
の後のif
ステートメントで保存できます。 openMapsWithItems:
配列内のアイテムの順序を逆にすると、座標to現在の位置から方向を取得することに注意してください。現在のロケーションマップアイテムの代わりに、構築された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];
}];
}
最適な方法は、MKMapItem
openInMapsWithLaunchOptions:launchOptions
で新しいiOS 6メソッドを呼び出すことです
例:
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];
これにより、現在の場所から運転するためのナビゲーションが開始されます。
Maps.Apple.comのURL "scheme"が見つかりました。古いデバイスをmaps.google.comに自動的にリダイレクトするため、これは適切な選択です。しかし、iOS 6には、利用できる新しいクラスがあります: MKMapItem 。
興味のある2つの方法:
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)
}
http://maps.Apple.com?q= ...リンク設定を使用すると、最初に古いデバイスでサファリブラウザーが開くのが面倒です。
したがって、maps.Apple.comへの参照でアプリを開くiOS 5デバイスの場合、手順は次のようになります。
(非常に明白でわかりにくい)ステップ2と3はユーザーにとって迷惑だと思います。したがって、OSバージョンを確認し、デバイスでmaps.google.comまたはmaps.Apple.comを実行します(それぞれiOS 5またはiOS 6 OSバージョンの場合)。
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];
}
代わりにGoogleマップを開きたい場合(または、2番目のオプションとして提供する場合)、 here で説明されているURLスキームcomgooglemaps://
およびcomgooglemaps-x-callback://
を使用できます。
この問題に関する私の研究により、次の結論に至りました。
@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)
}
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
マップを使用せず、プログラムで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で使用するようにスクラブしました。