Открытие карты с текущим местоположением и направлениями в iOS 6
Я создаю приложение, которое может открыть приложение "Карты" с указаниями от текущей позиции пользователя к другой позиции. Код выглядит так:
- (id)resolveDirectionsFromCoordinate:(CLLocationCoordinate2D)startCoordinate toCoordinate:(CLLocationCoordinate2D)endCoordinate
{
NSString* url = [NSString stringWithFormat: @"http://maps.google.com/maps?saddr=%f,%f&daddr=%f,%f",
startCoordinate.latitude, startCoordinate.longitude,
endCoordinate.latitude, endCoordinate.longitude];
[[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]];
return nil;
}
Thos хорошо работает в iOS 5.x. В iOS 6, однако, вместо этого запускается Safari, поскольку Карты больше не используют Google Maps.
Кто-нибудь знает, по какому URL мне следует звонить в iOS 6?
4 ответа
Документация Apple рекомендует использовать эквивалентную схему URL maps.apple.com
так что пользуйтесь
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]];
В качестве альтернативы вы также можете использовать maps://saddr=%f,%f&daddr=%f,%f
Схема, но она не поддерживает весь спектр параметров.
Использование + (BOOL)openMapsWithItems:(NSArray *)mapItems launchOptions:(NSDictionary *)launchOptions
метод. Из ссылки на класс MKMapItem:
Этот метод используется для передачи одного или нескольких элементов карты в приложение "Карты". Например, вы можете использовать этот метод, чтобы попросить приложение "Карты" отобразить результаты поиска на основе местоположения, сгенерированные вашим приложением. Карты отображают булавки в каждом указанном вами месте и используют содержимое каждого объекта карты для отображения дополнительной информации.
// 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 "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];
}
Это все:)
Я рекомендую проверить CMMapLauncher, мини-библиотеку, которую я создал для запуска Apple, Google и других приложений сопоставления iOS для конкретного запроса сопоставления. С CMMapLauncher код для получения направления в вашем вопросе будет:
[CMMapLauncher launchMapApp:CMMapAppAppleMaps
forDirectionsFrom:[CMMapPoint mapPointWithName:@"Origin"
coordinate:startCoordinate]
to:[CMMapPoint mapPointWithName:@"Destination"
coordinate:endCoordinate]];
Как вы можете видеть, он также инкапсулирует проверку версии, требуемую между iOS 6 и другими.