参考文档:
iOS 跳转方式实现地图导航功能
应用内导航
是指使用地图服务提供的SDK(比如高德,百度等等),直接将导航功能嵌入到我们自己的APP内部
但是这个方案我个人不喜欢,一是接入要一定的时间,二是增加APP的内存占用。
一、高德导航(应用内导航)
1、cocoaPods 安装高德导航SDK
platform :ios, "7.0" target 'yourTargetName' do pod 'AMapNavi' #导航SDK end
2、配置 Info.plist 文件。
由于导航需要定位,需申请定位权限,在 Info.plist 中加入 NSLocationAlwaysUsageDescription 字段。
3、在 AppDelegate.m 文件中
1) 引入头文件 #import <AMapFoundationKit/AMapFoundationKit.h>
2) 在didFinishLaunchingWithOptions 方法中配置高德 Key。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
……
[AMapServices sharedServices].apiKey = "您的Key";
……
}
4、在要跳转到高德导航地图的视图控器中
1)倒入头文件#import <AMapNaviKit/AMapNaviKit.h>
2)创建属性:compositeManager
@property (nonatomic, strong) AMapNaviCompositeManager *compositeManager;
3)在跳转的点击方法中
[cell.mapBtn addActionHandler:^(NSInteger tag) {
NSLog(@"点击了地图");
// 初始化
self.compositeManager = [[AMapNaviCompositeManager alloc] init];
// 如果需要使用AMapNaviCompositeManagerDelegate的相关回调(如自定义语音、获取实时位置等),需要设置delegate
// self.compositeManager.delegate = weakSelf;
// 通过present的方式显示路线规划页面, 在不传入起终点启动导航组件的模式下,options需传入nil
// [self.compositeManager presentRoutePlanViewControllerWithOptions:nil];
AMapNaviCompositeUserConfig *config = [[AMapNaviCompositeUserConfig alloc] init];
[config setRoutePlanPOIType:AMapNaviRoutePlanPOITypeEnd location:[AMapNaviPoint locationWithLatitude:[self.model.store_y floatValue] longitude:[self.model.store_x floatValue]] name:self.model.title POIId:nil]; //传入终点
[self.compositeManager presentRoutePlanViewControllerWithOptions:config];
}];
应用外导航
是以URI跳转的方式(在iOS中就是以URL Scheme的方式),直接跳到对应的地图APP中,直接利用对方的功能来导航。
这样的优点,一是接入方便,二是不增加自己APP的开销;缺点就是如果用户没有装这个地图应用就没办法使用这个地图的服务。
一、跳转到苹果自带地图
1、苹果提供了另一种方式:MKMapItem(要使用记得导入#import <MapKit/MapKit.h> 头文件)
2、实现代码:
CLLocationCoordinate2D loc = CLLocationCoordinate2DMake([self.model.latitude floatValue], [self.model.longitude floatValue]);
MKMapItem *currentLocation = [MKMapItem mapItemForCurrentLocation];
MKMapItem *toLocation = [[MKMapItem alloc] initWithPlacemark:[[MKPlacemark alloc] initWithCoordinate:loc addressDictionary:nil]];
[MKMapItem openMapsWithItems:@[currentLocation, toLocation]
launchOptions:@{MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving,
MKLaunchOptionsShowsTrafficKey: [NSNumber numberWithBool:YES]}];
toLocation.name =self.model.title;//终点地址名称
网友评论