导航 - 利用系统自带的App导航
导航:
- 可以将需要导航位置丢给系统自带的App进行导航
- 发送网络请求到公司服务器, 获取导航数据, 自己手动绘制导航
- 利用三方SDK进行导航(百度)
#import "ViewController.h"
#import <MapKit/MapKit.h>
#import "MBProgressHUD+MJ.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *startField;
@property (weak, nonatomic) IBOutlet UITextField *endField;
/**
* 编码对象
*/
@property (nonatomic, strong) CLGeocoder *geocoder;
@property (nonatomic, strong) CLLocationManager *mgr;
@end
@implementation ViewController
// 懒加载
- (CLGeocoder *)geocoder{
if (!_geocoder) {
_geocoder = [[CLGeocoder alloc] init];
}
return _geocoder;
}
- (CLLocationManager *)mgr{
if (!_mgr) {
_mgr = [[CLLocationManager alloc] init];
}
return _mgr;
}
/**
* 开始导航
*/
- (IBAction)startNavBtn:(id)sender {
// 1. 当开始导航时, 获取用户输入的起点和终点
NSString *startStr = self.startField.text;
NSString *endStr = self.endField.text;
if (startStr.length == 0 || startStr == nil || endStr == nil || endStr.length == 0) {
[MBProgressHUD showError:@"请输入起点和终点" toView:self.view];
return;
}
// 2. 利用GEO对象进行地理编码,获取到地标对象(CLPlacemark)
[self.geocoder geocodeAddressString:startStr completionHandler:^(NSArray *placemarks, NSError *error) {
if (placemarks.count == 0) return;
// 开始位置地标
CLPlacemark *startPlacemark = [placemarks firstObject];
[self.geocoder geocodeAddressString:endStr completionHandler:^(NSArray *placemarks, NSError *error) {
if (placemarks.count == 0) return;
// 结束位置地标
CLPlacemark *endPlacemark = [placemarks firstObject];
// 3. 再利用获取到的地标对象(CLPlacemark)创建(MKpalcemark) - 起点的item
[self startNavigationWithStartClPlacemark:startPlacemark endCLPlacemark:endPlacemark];
}];
}];
}
/**
* 开始导航
*
* @param startCLPlacemark 起点地标
* @param endClPlacemark 终点地标
*/
- (void)startNavigationWithStartClPlacemark:(CLPlacemark *)startCLPlacemark endCLPlacemark:(CLPlacemark *)endCLPlacemark
{
// 0. 创建起点和终点
// 0.1 创建起点地标
MKPlacemark *startMark = [[MKPlacemark alloc] initWithPlacemark:startCLPlacemark];
MKMapItem *startItem = [[MKMapItem alloc] initWithPlacemark:startMark];
// 0.2 创建终点地标
MKPlacemark *endMark = [[MKPlacemark alloc] initWithPlacemark:endCLPlacemark];
MKMapItem *endItem = [[MKMapItem alloc] initWithPlacemark:endMark];
NSArray *items = @[startItem, endItem];
/**
* 只要调用 MKMapItem 的open 方法, 就可以打开系统自带的地图App进行导航
*
* @param NSArray 告诉系统地图App 导航路线
*
* @launchOptions 启动系统自带App的附加参数(导航模式, 是否需要显示公交情况, 地图模式...)
*/
NSMutableDictionary *mutDic = [NSMutableDictionary dictionary];
// 设置导航的模式 - 驾车 走路
mutDic[MKLaunchOptionsDirectionsModeKey] = MKLaunchOptionsDirectionsModeDriving;
// 设置地图显示模式
mutDic[MKLaunchOptionsMapTypeKey] = @(MKMapTypeHybrid);
[MKMapItem openMapsWithItems:items launchOptions:mutDic];
}
- (void)viewDidLoad {
[super viewDidLoad];
//
if(IOS8){
[self.mgr requestAlwaysAuthorization];
}
}
导航 - 利用系统自带的App导航的更多相关文章
- (八十一)利用系统自带App来实现导航
利用系统的地图App进行导航,只需要传入起点和终点.启动参数,调用MKMapItem的类方法openMapWithItems:launchOptions:来实现定位,调用此方法后会打开系统的地图App ...
- Android利用系统原生BottomNavigationView实现底部导航
<android.support.design.widget.BottomNavigationView android:id="@+id/navigation" androi ...
- 利用系统自带工具快速实现SSH免密远程登录
一.软件环境 操作系统:CentOS Linux release 7.4.1708 (Core) SSH版本 [root@Geeklp201 ~]# ssh -V OpenSSH_7.4p1, Ope ...
- 8种移动APP导航设计模式对照
当我们确定了移动APP的设计需求和APP产品设计流程之后,開始着手设计APP界面UI或是APP原型图啦.这个时候我们都要面临的第一个问题就是怎样将信息以最优的方式组合起来? 或许我们对照和了解了其它一 ...
- 应用程序间跳转 (友盟SSO 授权 与系统自带的分享)
应用程序间跳转的应用场景 使用第三方用户登录,如微信登录,返回用户名和密码 需要用户授权,返回到调用程序,同时返回授权的用户名 应用程序推广,跳转到itunes并显示指定app下载页 第三方支付,跳转 ...
- 如何获取安卓系统自带应用的package和activity
之前在做appium自动化测试的时候,参考网上的例子,运行安卓系统自带的app,所以,就需要获取系统自带的package(包名)和activity.这里简单记录一下,不一定适合所有的系统应用. 运行环 ...
- app整体搭建环境:tabBar切换不同控制器的封装(自定义导航+自定义uiviewcontroler+系统自带tabbar+自定义tabbarController)
首先,一个app的搭建环境非常重要.既要实现基本功能,又要考虑后期优化的性能. 现在很多应用不仅仅是系统自带的控制器,由于需求复杂,基本上需要自定义多控制器来管理. 新建一个BasicNavigati ...
- 利用系统APP实现导航---By张秀清
苹果系统本身自带一个地图APP,但是功能并不是很强大,但是一些简单的导航功能还是能做出来的,下面贴上我的代码 // // ViewController.m // 系统APP导航 // // Creat ...
- iOS-tabBar切换不同控制器封装(自定义导航+自定义uiviewcontroler+系统自带tabbar+自定义tabbarController)
首先,一个app的搭建环境非常重要.既要实现基本功能,又要考虑后期优化的性能. 现在很多应用不仅仅是系统自带的控制器,由于需求复杂,基本上需要自定义多控制器来管理. 新建一个BasicNavigati ...
随机推荐
- 彻底理解android中的内部存储与外部存储
我们先来考虑这样一个问题: 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的 ...
- Debian 6解决中文乱码
DEBIAN下中文显示 一.首先检查LOCALE情况 说明:DEBIAN因为基于GNU所以,对不同地域进行了不同的包支持,以LOCALE形式存在. 1.挂载ISO文件包,前8个ISO包就可以(这里不在 ...
- Smokeping 监控部署及配置
安装参见: https://github.com/oetiker/SmokePing/blob/master/doc/smokeping_install.pod 1 Smokeping *** Gen ...
- Atom编辑器入门到精通(二) 插件的安装和管理
在本节中我们会学习如果安装和使用插件插件是Atom中一个非常重要的组成部分,很多功能都是以插件形式存在的.比如上篇文章中提到的目录树和设置等窗口都是通过默认安装的插件来实现的. 查看已安装的插件 打开 ...
- 通过jQuery的attr修改onclick值的的解决方法
好了,直接给大家贴上js代码吧 var js = "alert('B:' + this.id); return false;"; var newclick = eval(" ...
- Android免坑指南(一)Sugar与SQLite
最近在Android手机开发中使用了ORM框架Sugar1.4,节省了大量代码,同时也遇到不少麻烦,记录如下: 1. 使用group by将查询结果转换为POJO对象 在Sugar1.4中,可以使用如 ...
- JavaMail组件实现邮件功能
实现邮件收发功能需要3个jar包: 1.JavaMail组件保内的mail.jar和smtp.jar包 2.JAF组件包里的activition.jar. 复制到WebRoot/WEB-INF/lib ...
- 配置git DiffMerge工具
git的命令行貌似没有特别好用的UI工具,不管是Android Studio自带的还是其他的,完全代替命令行好像做不到.再加上对git来说没什么比diff和merge更正常不过的事情了.那就配置命令行 ...
- Android Animation 动画属性
在 Android 中, Animation 动画效果的实现可以通过两种方式进行实现: 一种是 tweened animation 渐变动画,另一种是 frame by frame animation ...
- 学习笔记_第一个strut程序_之中文乱码,过滤器解决方案及过程总结
1. 第一次碰到加过滤器的过程,就是在学习struct1的时候,中文乱码 几个需要注意的关键字 2.什么叫package 所谓package就是打包的意思,就是说以下程序都是处于这个包内,所以一开始 ...