導航 - 利用系統內建的App導航

來源:互聯網
上載者:User

標籤:

 

導航: 

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.