マップキットが統合されたビューコントローラーがあります。そのマップを開く前にアラートを発して、マップを開くためにマップのすべての同様のアプリケーションから選択するように依頼する必要があります。たとえば、Googleマップアプリが私のiPhoneにインストールされている場合、デフォルトのマップキットビューと一緒にそのオプションがあるはずです。 iPhoneから同様のアプリをすべてスキャンし、マップを開くためのオプションとして結果を返すこの機能を実現する可能性はありますか?.
Sumeshの回答を使用して、インストールされたアプリをマップするためのチェックの配列を作成できます [1] :
var installedNavigationApps : [String] = ["Apple Maps"] // Apple Maps is always installed
そして、あなたが考えることができるすべてのナビゲーションアプリで:
if (UIApplication.sharedApplication().canOpenURL(url: NSURL)) {
self.installedNavigationApps.append(url)
} else {
// do nothing
}
一般的なナビゲーションアプリは次のとおりです。
さらに多くのことがあります: http://wiki.akosma.com/IPhone_URL_Schemes
インストールされているナビゲーションアプリのリストを作成したら、UIAlertControllerを表示できます。
let alert = UIAlertController(title: "Selection", message: "Select Navigation App", preferredStyle: .ActionSheet)
for app in self.installNavigationApps {
let button = UIAlertAction(title: app, style: .Default, handler: nil)
alert.addAction(button)
}
self.presentViewController(alert, animated: true, completion: nil)
もちろん、指定されたurlschemeを使用して、ハンドラーでボタンクリックの動作を追加する必要があります。たとえば、Googleマップがクリックされた場合は、次のようなものを使用します。
UIApplication.sharedApplication().openURL(NSURL(string:
"comgooglemaps://?saddr=&daddr=\(place.latitude),\(place.longitude)&directionsmode=driving")!) // Also from sumesh's answer
Apple MapsとGoogleMapsがインストールされているだけで、次のようになります。
似たようなものを探している他の人は、UIActivityViewControllerを使用できます。これは、共有ボタンをクリックしたときに使用するのと同じUIControlPhotosまたはSafariです。
AppleマップとGoogleマップの場合、カスタムアプリケーションアクティビティを追加して、他のアイテムと一緒に表示できます。UIActivityをサブクラス化し、titleメソッドとimageメソッドをオーバーライドする必要があります。perform()関数を使用して、カスタムアイテムをタップします
以下は私が同じために書いたObjectiveCコードです。 Swiftコードについては参照できます IActivityViewController Swift
NSMutableArray *activityArray = [[NSMutableArray alloc] init];
// Check if google maps is installed and accordingly add it in menu
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"comgooglemaps://"]]) {
GoogleMapsActivityView *googleMapsActivity = [[GoogleMapsActivityView alloc] init];
[activityArray addObject:googleMapsActivity];
}
// Check if Apple maps is installed and accordingly add it in menu
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"maps://"]]) {
AppleMapsActivityView *appleMapsActivity = [[AppleMapsActivityView alloc] init];
[activityArray addObject:appleMapsActivity];
}
NSArray *currentPlaces = [NSArray arrayWithObject:place];
UIActivityViewController *activityViewController =
[[UIActivityViewController alloc] initWithActivityItems:currentPlaces
applicationActivities:activityArray];
activityViewController.excludedActivityTypes = @[UIActivityTypePrint,
UIActivityTypeCopyToPasteboard,
UIActivityTypeAssignToContact,
UIActivityTypeSaveToCameraRoll,
UIActivityTypePostToWeibo,
UIActivityTypeAddToReadingList,
UIActivityTypePostToVimeo,
UIActivityTypeAirDrop];
[self presentViewController:activityViewController animated:YES completion:nil];
そして、GoogleMapsActivityをサブクラス化します
@interface GoogleMapsActivityView: UIActivity
@end
@implementation GoogleMapsActivityView
- (NSString *)activityType {
return @"yourApp.openplace.googlemaps";
}
- (NSString *)activityTitle {
return NSLocalizedString(@"Open with Google Maps", @"Activity view title");
}
- (UIImage *)activityImage {
return [UIImage imageNamed:@"ic_google_maps_logo"];
}
- (UIActivityCategory)activityCategory {
return UIActivityCategoryAction;
}
- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems {
return YES;
}
- (void)performActivity {
CLLocationDegrees lat = 99999;
CLLocationDegrees lng = 99999;
NSString *latlong = [NSString stringWithFormat:@"%.7f,%@%.7f", lat, @"", lng];
NSString *urlString = [NSString stringWithFormat:@"comgooglemaps://?q=%@", latlong];
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:urlString]]) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]
options:@{}
completionHandler:nil];
}
[self activityDidFinish:YES];
}