標籤:
導航:
- 可以將需要導航位置丟給系統內建的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導航