利用系统的地图App进行导航,只需要传入起点和终点、启动参数,调用MKMapItem的类方法openMapWithItems:launchOptions:来实现定位,调用此方法后会打开系统的地图App。

下面我们来看看这个方法:

+ (BOOL)openMapsWithItems:(NSArray *)mapItems launchOptions:(NSDictionary *)launchOptions;

①第一个参数是一个MapItem数组,每个MapItem中可以包含一个地标,用两个MapItem,一个作起点,一个作终点。

可以利用MKPlacemark初始化,而MKPlacemark可以利用CLPlacemark初始化,要得到CLPlacemark,可以利用CLGeocoder对象对地名进行地理编码得到。

②第二个参数是一个字典,字典中的键和值都可以通过手册查到,值可以使用之前设置地图属性时的值,注意非对象需要包装。

下面的代码演示了通过两个TextField输入起点和终点的地名,通过点击开始定位按钮实现打开系统自带地图App进行定位。

注意block是回调方法,为了保证顺序获取起点终点的地标,要在第一个block内写第二个block代码。

#import "ViewController.h"
#import <MapKit/MapKit.h> @interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *startView;
@property (weak, nonatomic) IBOutlet UITextField *endView;
@property (strong, nonatomic) CLGeocoder *gcoder;
@property (strong, nonatomic) CLPlacemark *startMrk,*endMrk; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; _gcoder = [[CLGeocoder alloc] init]; } - (IBAction)startGeo:(id)sender { NSString *startStr = _startView.text;
NSString *endStr = _endView.text; [_gcoder geocodeAddressString:startStr completionHandler:^(NSArray *placemarks, NSError *error) {
if (!placemarks.count) return;
_startMrk = [placemarks firstObject];
[_gcoder geocodeAddressString:endStr completionHandler:^(NSArray *placemarks, NSError *error) {
if (!placemarks.count) return;
_endMrk = [placemarks firstObject];
[self startNavigation];
}];
}]; } - (void)startNavigation{ MKPlacemark *startMrk = [[MKPlacemark alloc] initWithPlacemark:_startMrk];
MKPlacemark *endMrk = [[MKPlacemark alloc] initWithPlacemark:_endMrk];
MKMapItem *startItem = [[MKMapItem alloc] initWithPlacemark:startMrk];
MKMapItem *endItem = [[MKMapItem alloc] initWithPlacemark:endMrk];
NSArray *items = @[startItem,endItem]; NSMutableDictionary *options = [NSMutableDictionary dictionary];
/*
启动参数的key
NSString * const MKLaunchOptionsDirectionsModeKey;
NSString * const MKLaunchOptionsMapTypeKey;
NSString * const MKLaunchOptionsMapCenterKey;
NSString * const MKLaunchOptionsMapSpanKey;
NSString * const MKLaunchOptionsShowsTrafficKey;
NSString * const MKLaunchOptionsCameraKey
一般键值也是常量字符串,有些是结构体需要用@包装
*/
options[MKLaunchOptionsDirectionsModeKey] = MKLaunchOptionsDirectionsModeDriving;
options[MKLaunchOptionsMapTypeKey] = @(MKMapTypeStandard);
[MKMapItem openMapsWithItems:items launchOptions:options]; } @end

(八十一)利用系统自带App来实现导航的更多相关文章

  1. 导航 - 利用系统自带的App导航

    导航: 可以将需要导航位置丢给系统自带的App进行导航 发送网络请求到公司服务器, 获取导航数据, 自己手动绘制导航 利用三方SDK进行导航(百度) #import "ViewControl ...

  2. ios打开系统自带APP

    打开系统自带app 打开系统设置: [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root= ...

  3. Android系统自带APP分析——短信app

    Android操作系统本身就是一个巨大的开源软件仓库,熟悉它既可以了解到Android系统的设计框架,也可以获得高效的应用程序编写方式.本文所分析的源码来自于Google官方的AOSP源码4.0.1_ ...

  4. 利用系统自带工具快速实现SSH免密远程登录

    一.软件环境 操作系统:CentOS Linux release 7.4.1708 (Core) SSH版本 [root@Geeklp201 ~]# ssh -V OpenSSH_7.4p1, Ope ...

  5. 应用程序间跳转 (友盟SSO 授权 与系统自带的分享)

    应用程序间跳转的应用场景 使用第三方用户登录,如微信登录,返回用户名和密码 需要用户授权,返回到调用程序,同时返回授权的用户名 应用程序推广,跳转到itunes并显示指定app下载页 第三方支付,跳转 ...

  6. 如何获取安卓系统自带应用的package和activity

    之前在做appium自动化测试的时候,参考网上的例子,运行安卓系统自带的app,所以,就需要获取系统自带的package(包名)和activity.这里简单记录一下,不一定适合所有的系统应用. 运行环 ...

  7. 利用win7系统自带的dos命令把笔记本无线网卡当无线路由器(无线AP发射器)

    利用win7系统自带的dos命令把笔记本无线网卡当无线路由器(无线AP发射器). 1.打开win7开始菜单,找到命令提示符选项,以管理员身份运行cmd.2.在命令行上输入:netsh wlan set ...

  8. app整体搭建环境:tabBar切换不同控制器的封装(自定义导航+自定义uiviewcontroler+系统自带tabbar+自定义tabbarController)

    首先,一个app的搭建环境非常重要.既要实现基本功能,又要考虑后期优化的性能. 现在很多应用不仅仅是系统自带的控制器,由于需求复杂,基本上需要自定义多控制器来管理. 新建一个BasicNavigati ...

  9. 教你怎么把安卓应用软件放到系统根目录system/app下

    安卓手机有时候安装的软件多了,用着久了就会出现卡机,死机的现象,流畅度大大的减弱了,实在是影响使用体验.对于这种情况,有的人会经常清理后台程序,可是次数多了,提速的效果也不太明显.那么,到底怎么做才能 ...

随机推荐

  1. ubuntu14.0464位 Ros环境 安装halcon13.01

    至于ROS的系统,之前就是安装好的,如果有疑问的可以参考官网的安装教程,按照指令一步一步的操作,http://wiki.ros.org/cn/indigo/Installation/Ubuntu (1 ...

  2. python实现tab键自动补全

    一.查询python安装路径,一般默认是/usr/lib64/ [root@host2 ~]# python Python (r266:, Jul , ::) [GCC (Red Hat -)] on ...

  3. C语言程序第二次作业

    (一)改错题 1.输出带框文字:在屏幕上输出以下3行信息. ************* Welcome ************* 源程序 include int mian() { printf(&q ...

  4. 数据结构 栈&队列

    2-4 依次在初始为空的队列中插入元素a,b,c,d以后,紧接着做了两次删除操作,此时的队头元素是( ) 删除,移动头指针: 增加,移动尾指针: 删除a,b ,队头c 2-3 在一个链队列中,fron ...

  5. 转:rabbitMQ 安装与管理

    安装环境 虚拟机:VMware® Workstation 10.0.1 build Linux系统:CentOS6.5 官方安装:http://www.rabbitmq.com/install-rpm ...

  6. Linux shell查询ip归属地

    起因 有的时候写脚本需要能够在脚本中获取到ip的归属地,比如分析登录日志列出攻击者的相关信息等. 可以使用whois来查询ip的详细信息,但是whois并不是每台机器预装的,而且我想看中文的结果,所以 ...

  7. Hibernate异常之cascade

    org.hibernate.MappingException: Unsupported cascade style: delete-option at org.hibernate.engine.spi ...

  8. C++后台实践:古老的CGI与Web开发

    本文写给C/C++程序猿,也适合其他对历史感兴趣的程序猿 ============================================= 谈到web开发,大家首先想到的PHP.JavaEE ...

  9. TCP协议的性能评测工具 — Tcpdive开源啦

    Github地址:https://github.com/fastos/tcpdive 为什么要开发Tcpdive 在过去的几年里,随着移动互联网的飞速发展,整个基础网络已经发生了翻天覆地的变化. 用户 ...

  10. Apache shiro集群实现 (七)分布式集群系统下---cache共享

    Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...