(八十一)利用系统自带App来实现导航

利用系统的地图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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-31 12:11:00

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

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

导航: 可以将需要导航位置丢给系统自带的App进行导航 发送网络请求到公司服务器, 获取导航数据, 自己手动绘制导航 利用三方SDK进行导航(百度) #import "ViewController.h" #import <MapKit/MapKit.h> #import "MBProgressHUD+MJ.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIText

利用系统自带脚本utlsampl.sql创建scott用户及样本数据

SQL>  select * from v$version; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production PL/SQL Release 11.2.0.1.0 - Production CORE    11.2.0.

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

应用程序间跳转的应用场景 使用第三方用户登录,如微信登录,返回用户名和密码 需要用户授权,返回到调用程序,同时返回授权的用户名 应用程序推广,跳转到itunes并显示指定app下载页 第三方支付,跳转到支付APP,如支付宝,微信钱包 显示位置及导航功能时,跳转到第三方地图应用. 打电话.发邮件.发短信.打开网页等,跳转到内置APP程序 应用间的跳转: 1.//url :统一资源占位符 http://baidu.com tel://110 file:///apple/storebock //由 

Dialog(八)——改变系统自带Dialog字体大小(ContextThemeWrapper)

MainActivity如下: package c.c.testdialog; import android.app.Activity; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; import android.v

利用命令行删除Android系统自带应用的方法

一般来说,手机厂家都会在手机中内置许多应用,而这些应用是使用一般的应用程序管理无法删除的.当然,现在有一些APP,如360和豌豆荚,在获取了系统的root权限之后是可以删除自带应用的.但是如果我不想让一个app来获取我的root权限呢?有没有方便.快捷的方法呢? 当然有,那就是利用shell命令.当然,首先要安装当前手机的驱动程序,否则无法进行调试. 在如何删除Android系统中的内置应用一文中作者也介绍了利用命令行删除系统应用的方法,但是个人感觉太麻烦了,其实有更简单的方法,只要三步即可:a

利用Windows系统自带的Powershell功能计算文件的MD5、SHA256等Hash值

概述 windows系统自带的Powershell非常的强大, 是为了代替CMD而设计的, 本文将介绍如何不使用第三方软件计算文件的校验值 前提 windows系统必须是Windows 7 SP1及以上 使用 如图, 要校验图中的Test.hex文件 在当前目录下点击文件->打开Windows Powershell->打开Windows Powershell 输入Get-FileHash -Algorithm MD5 .\Test.hex回车即可 -Algorithm后面是计算hash的算法,

利用C#自带组件强壮程序日志

前言 在项目正式上线后,如果出现错误.异常.崩溃等情况, 我们往往第一想到的事就是查看日志. 所以日志对于一个系统的维护是非常重要的. 声明 本文中的示例代码旨在这个框架是怎么工作的,具体实现可以自由发挥. 贯穿所有的日志系统 日志系统,往往是贯穿一个程序的所有代码的; 试想一下,如果你的日志完全是由第三方组件提供的; 那么就意味着,你的所有项目都必须引用这个dll; 也许你会说自己可以2次封装,那么依然需要所有项目都引用你的这个封装后的log项目, 另一方面 一些log组件需要实例化后才可以使

IOS系统自带社交分享

很多APP中都带有社交分享功能,通过用户的分享,让更多地人去了解和使用这个APP,目前社交分享是移动互联网应用程序推广的最重要手段之一,国内较或的分享平台有微信,IOS6后苹果集成的新浪微博,还有IOS7后集成的腾讯微博. 在IOS中,实现社交分享可以自己编写各个平台的分享代码,但代码量较多,也可以利用IOS自带的Social.framework,更可以利用第三方的分享框架,如友盟,ShareSDK等.接下来先介绍一个系统自带的分享功能. 打开设备或模拟器的偏好设置,可以看到如下 系统需要先登录

android系统自带的Service原理与使用

1. 说明 android的后台运行在很多service,它们在系统启动时被SystemServer开启,支持系统的正常工作,比如 MountService监听是否有SD卡安装及移除,ClipboardService提供剪切板功能,PackageManagerService提 供软件包的安装移除及查看等等,应用程序可以通过系统提供的Manager接口来访问这些Service提供的数据,以下将说明他们的工具流程 2. 举例说明基本流程 以android系统支持sensor(传感器)实例来说明框架层