openURL
とsaddr
のパラメーターをロケーション文字列または緯度/経度で使用して、GoogleマップのURLでdaddr
を呼び出すことで、iPhoneマップアプリケーションを起動できることを知っています(以下の例を参照) 。
しかし、開始アドレスを"Current Location"マップブックマークにして、Mapsアプリのロケーション処理コードを使用できるようにすることは可能かどうか疑問に思っています。私のグーグル検索はほとんど役に立たなかった。
例えば:
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat: @"http://maps.google.com/maps?saddr=%@&daddr=%@", myLatLong, latlong]]];
myLatLong
の代わりに現在の場所のブックマークを呼び出すものを除きます。
Core Locationを使用して現在の場所を取得する必要がありますが、その緯度/経度のペアを使用すると、Mapsからそこから自分の住所または場所にルーティングできます。そのようです:
CLLocationCoordinate2D currentLocation = [self getCurrentLocation];
// this uses an address for the destination. can use lat/long, too with %f,%f format
NSString* address = @"123 Main St., New York, NY, 10001";
NSString* url = [NSString stringWithFormat: @"http://maps.google.com/maps?saddr=%f,%f&daddr=%@",
currentLocation.latitude, currentLocation.longitude,
[address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]];
最後に、CoreLocationを使用して現在の場所を明示的に検索することを避けたい場合、および@"http://maps.google.com/maps?saddr=Current+Location&daddr=%@"
urlの代わりに 以下のコメントで提供したこのリンクを参照Current + Location文字列のローカライズ方法について。ただし、ドキュメント化されていない別の機能を利用しているため、Jason McCrearyが以下で指摘しているように、将来のリリースでは確実に機能しない可能性があります。
当初、MapsはGoogleマップを使用していましたが、現在はAppleとGoogleには個別のマップアプリがあります。
1)Googleマップアプリを使用してルーティングする場合は、 comgooglemaps URLスキーム を使用します。
NSString* url = [NSString stringWithFormat: @"comgooglemaps://?daddr=%@&directionsmode=driving",
[address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
BOOL opened = [[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]];
2)Apple Mapsを使用するには、iOS 6の新しいMKMapItem
クラスを使用できます。 Apple APIドキュメントはこちら をご覧ください
基本的に、宛先coordinates(latlong
)へのルーティングの場合、次のようなものを使用します。
MKPlacemark* place = [[MKPlacemark alloc] initWithCoordinate: latlong addressDictionary: nil];
MKMapItem* destination = [[MKMapItem alloc] initWithPlacemark: place];
destination.name = @"Name Here!";
NSArray* items = [[NSArray alloc] initWithObjects: destination, nil];
NSDictionary* options = [[NSDictionary alloc] initWithObjectsAndKeys:
MKLaunchOptionsDirectionsModeDriving,
MKLaunchOptionsDirectionsModeKey, nil];
[MKMapItem openMapsWithItems: items launchOptions: options];
同じコードでiOS 6以降とiOS 6以前の両方をサポートするために、AppleがMKMapItem
APIドキュメントページにある次のコードのようなものを使用することをお勧めします。
Class itemClass = [MKMapItem class];
if (itemClass && [itemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)]) {
// iOS 6 MKMapItem available
} else {
// use pre iOS 6 technique
}
これは、Xcode Base SDKがiOS 6(または最新iOS)であることを前提としています。
NSString* addr = [NSString stringWithFormat:@"http://maps.google.com/maps?daddr=Current Location&saddr=%@",startAddr];
NSURL* url = [[NSURL alloc] initWithString:[addr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[[UIApplication sharedApplication] openURL:url];
[url release];
これは機能しますが、iPhone/iPodの言語が英語に設定されている場合のみです。他の言語をサポートする場合は、ローカライズされた文字列を使用してマップのブックマーク名と一致させる必要があります。
次のようなプリプロセッサ#defineを使用できます。
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
iOSのバージョンを理解します。次に、このコードを使用してiOS 6もサポートできます。
NSString* addr = nil;
if (SYSTEM_VERSION_LESS_THAN(@"6.0")) {
addr = [NSString stringWithFormat:@"http://maps.google.com/maps?daddr=%1.6f,%1.6f&saddr=Posizione attuale", view.annotation.coordinate.latitude,view.annotation.coordinate.longitude];
} else {
addr = [NSString stringWithFormat:@"http://maps.Apple.com/maps?daddr=%1.6f,%1.6f&saddr=Posizione attuale", view.annotation.coordinate.latitude,view.annotation.coordinate.longitude];
}
NSURL* url = [[NSURL alloc] initWithString:[addr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[[UIApplication sharedApplication] openURL:url];
サンドボックス化のため、Mapアプリケーションのブックマークにアクセスできません。
代わりに、Core Locationを使用して現在の場所を自分で決定してください。次に、作成したURLでその場所(緯度と経度)を使用してマップを開きます。
CMMapLauncher をチェックアウトすることをお勧めします。これは、特定のマッピングリクエストでApple、Google、およびその他のiOSマッピングアプリを起動するために作成したミニライブラリです。 CMMapLauncherを使用すると、質問の方向を取得するコードは次のようになります。
[CMMapLauncher launchMapApp:CMMapAppAppleMaps
forDirectionsFrom:[CMMapPoint mapPointWithName:@"Origin"
coordinate:myLatLong]
to:[CMMapPoint mapPointWithName:@"Destination"
coordinate:latlong]];
ご覧のとおり、iOS 6と他のユーザーとの間で必要なバージョンチェックもカプセル化します。
IOS6がリリースされてからね!
Appleは悪い点で驚くべきことをしました(私の観点から)。
Appleのマップが起動されます。iOS6を実行しているデバイスでは、maps.google.com/?q=
iDeviceでネイティブのPlanアプリを開く場合。今ではmaps.Apple.com/?q=
。
開発者が多くの作業をする必要がないように、フレンドリーなmaps.Apple.comサーバーはすべての非Appleデバイスをmaps.google.comにリダイレクトするため、変更は透過的です。
このようにして、開発者はすべてのGoogleクエリ文字列をApple ones。に切り替える必要があります。これは私が嫌いなものです。
今日はその機能を実装する必要があったので、それを行いました。しかし、モバイルサイトにあるすべてのURLをAppleのマップサーバーをターゲットとするように書き換えるだけではいけないと感じたので、iDevicesサーバー側を検出して、Apple URLだけを提供します。共有します。
PHPを使用しているため、オープンソースのモバイル検出ライブラリを使用しました: http://code.google.com/p/php-mobile-detect/
ブール値のゲッターとしてisiPad
疑似メソッドを使用するだけで、GoogleをApple ;-)に変換することはありません
$server=$detect->isiPad()?"Apple":"google";
$href="http://maps.{$server}.com/?q=..."
乾杯!
本当の解決策はここにあります。 Z5コンセプトiOS開発コードスニペット
ほんの少しのエンコードが必要です。
- (IBAction)directions1_click:(id)sender
{
NSString* address = @"118 Your Address., City, State, ZIPCODE";
NSString* currentLocation = @"Current Location";
NSString* url = [NSStringstringWithFormat: @"http://maps.google.com/maps?saddr=%@&daddr=%@",[currentLocation stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],[address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
UIApplication *app = [UIApplicationsharedApplication];
[app openURL: [NSURL URLWithString: url]];
}
場所の許可を求めたくない場合、latとlngがない場合は、次を使用します。
NSString *destinationAddress = @"Amsterdam";
Class itemClass = [MKMapItem class];
if (itemClass && [itemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)]) {
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressString:destinationAddress completionHandler:^(NSArray *placemarks, NSError *error) {
if([placemarks count] > 0) {
MKPlacemark *placeMark = [[MKPlacemark alloc] initWithPlacemark:[placemarks objectAtIndex:0]];
MKMapItem *mapItem = [[MKMapItem alloc]initWithPlacemark:placeMark];
MKMapItem *mapItem2 = [MKMapItem mapItemForCurrentLocation];
NSArray *mapItems = @[mapItem, mapItem2];
NSDictionary *options = @{
MKLaunchOptionsDirectionsModeKey:MKLaunchOptionsDirectionsModeDriving,
MKLaunchOptionsMapTypeKey:
[NSNumber numberWithInteger:MKMapTypeStandard],
MKLaunchOptionsShowsTrafficKey:@YES
};
[MKMapItem openMapsWithItems:mapItems launchOptions:options];
} else {
//error nothing found
}
}];
return;
} else {
NSString *sourceAddress = [LocalizedCurrentLocation currentLocationStringForCurrentLanguage];
NSString *urlToOpen = [NSString stringWithFormat:@"http://maps.google.com/maps?saddr=%@&daddr=%@",
[sourceAddress stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
[destinationAddress stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlToOpen]];
}
Ios5の場合、現在の場所は正しい言語である必要があります。この投稿のLocalizedCurrentLocationを使用します http://www.martip.net/blog/localized-current-location-string-for-iphone-apps
Ios6の場合、CLGeocoderを使用して目印を取得し、それと現在の場所で地図を開きます。
CoreLocation.frameworkとMapKit.frameworkを忘れずに追加してください
IOS6の場合、Apple docsは同等のmaps.Apple.com URLスキームの使用を推奨しています
使用する
http://maps.Apple.com/maps?saddr=%f,%f&daddr=%f,%f
の代わりに
http://maps.google.com/maps?saddr=%f,%f&daddr=%f,%f
後方互換性を保つために、コードは
NSString* versionNum = [[UIDevice currentDevice] systemVersion];
NSString *nativeMapScheme = @"maps.Apple.com";
if ([versionNum compare:@"6.0" options:NSNumericSearch] == NSOrderedAscending)
nativeMapScheme = @"maps.google.com";
}
NSString* url = [NSString stringWithFormat: @"http://%@/maps?saddr=%f,%f&daddr=%f,%f", nativeMapScheme
startCoordinate.latitude, startCoordinate.longitude,
endCoordinate.latitude, endCoordinate.longitude];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
Apple Maps URLスキーム: Apple URLスキームリファレンス
コードの他の部分に条件付きコードがある場合は、これらのiOSバージョン検出マクロを使用できます。 iOSバージョンマクロ
これは、モバイルデバイスのURLからのみHTMLで実行できます。 例 です。クールなことは、これをqrコードに変換すると、誰かが電話でスキャンするだけで、どこにいても道順を知ることができるようになるということです。
私の提案は OpenInGoogleMaps-iOS を使用することです。これは最新の選択肢であるため(2015年11月まで)、ココアポッドのインストールをサポートし、数回クリックするだけで準備が整います。
次を使用してインストール:pod "OpenInGoogleMaps"
次を使用してヘッダーファイルで必須:#import "OpenInGoogleMapsController.h"
以下のサンプルコード:
/*In case the user does NOT have google maps, then Apple maps shall open*/
[OpenInGoogleMapsController sharedInstance].fallbackStrategy = kGoogleMapsFallbackAppleMaps;
/*Set the coordinates*/
GoogleMapDefinition *definition = [[GoogleMapDefinition alloc] init];
CLLocationCoordinate2D metsovoMuseumCoords; //coordinates struct
metsovoMuseumCoords.latitude = 39.770598;
metsovoMuseumCoords.longitude = 21.183215;
definition.zoomLevel = 20;
definition.center = metsovoMuseumCoords; //this will be the center of the map
/*and here we open the map*/
[[OpenInGoogleMapsController sharedInstance] openMap:definition];
Googleマップの現在のバージョンでは、単にsadr
パラメーターを省略します:
saddr
:…値が空白のままの場合、ユーザーの現在の場所が使用されます。
https://developers.google.com/maps/documentation/ios/urlscheme
IOS6 Mapsアプリの場合は、上記の同じURLを使用できますhttp://maps.google.com/maps?saddr=%f,%f&daddr=%@
ただし、GoogleマップのURLの代わりに、maps://
次のURLになります:maps://saddr=%f,%f&daddr=%@.
「現在地」を使用してもうまくいかないようですので、私はその座標にとどまりました。
Antotherの良い点:後方互換性:iOS5では、Googleマップアプリを起動します。
別のスレッドでこれに答えました。 ( 現在の場所はApple Maps IOS 6 では機能しません。)最初に現在の場所の座標を取得する必要があります、それを使用してマップURLを作成します。
ソースの場所を指定しない場合、ソースとして現在の場所が使用されます。以下のコードを試してください-
let urlString = " http://maps.Apple.com/maps?daddr=(destinationLocation.latitude)、(destinationLocation.longitude)&dirflg = d "}
UIApplication.shared.openURL(URL(string:urlString)!)