iOS - 使用系統(tǒng)地圖進(jìn)行導(dǎo)航

由于項(xiàng)目中少部分用到定位導(dǎo)航功能,就學(xué)習(xí)了一下這方面的知識(shí),有自己總結(jié)的,也有從大神那里學(xué)習(xí)到的,有錯(cuò)誤的地方希望有大神可以幫我提出,立即改正,寫(xiě)這篇文章的目的主要是想自己做個(gè)筆記,省的以后再做的時(shí)候耽誤時(shí)間

整體思路:在視圖即將顯示的時(shí)候?qū)嵗疞ocationManger對(duì)象,設(shè)置代理,在代理方法中獲取到用戶的經(jīng)緯度,然后反地理編碼,把經(jīng)緯度轉(zhuǎn)化成文字,賦值給cityStr,設(shè)置導(dǎo)航

模擬器使用時(shí)需手動(dòng)設(shè)置經(jīng)緯度,也有可能設(shè)置好了,運(yùn)行項(xiàng)目也不會(huì)執(zhí)行,所以建議使用真機(jī)測(cè)試

![43568E90-BBCB-4B2E-A73A-15618058F8AD.png](http://upload-images.jianshu.io/upload_images/1707826-67d3ce658f2fe9b7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

CLLocation 常用屬性簡(jiǎn)介

  CLLocationDegrees latitude;緯度
  CLLocationDegrees longitude;經(jīng)度
  @property(readonly, nonatomic) CLLocationCoordinate2D coordinate; 坐標(biāo),只有x.y
  @property(readonly, nonatomic) CLLocationDistance altitude;海拔
  @property(readonly, nonatomic) CLLocationAccuracy horizontalAccuracy;水平經(jīng)度
  @property(readonly, nonatomic) CLLocationAccuracy verticalAccuracy;垂直經(jīng)度

版本支持

判斷版本,如果大于iOS8需要進(jìn)行授權(quán) ,同時(shí)配置plist文件

![Uploading C0002AE7-960C-4E3A-B2A6-F7A30C1DCBAD_053280.png . . .]

NSLocationWhenInUseUsageDescription
NSLocationAlwaysUsageDescription
這兩個(gè)key

CLLocationManagerDelegate 說(shuō)明

 //定位更新;從oldLocation到了newLocation;方法過(guò)期,如果實(shí)現(xiàn)了locationManager:didUpdateLocations:,該方法不被調(diào)用
-(void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
//成功獲取定位數(shù)據(jù)后就會(huì)激發(fā)該方法;locations最后一個(gè)為最新的
 -(void)locationManager:(CLLocationManager *)manager
 didUpdateLocations:(NSArray<CLLocation *> *)locations

 //成功獲取設(shè)備方向數(shù)據(jù)后就會(huì)激發(fā)該方法
-(void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading
 //是否顯示方向刻度
 -(BOOL)locationManagerShouldDisplayHeadingCalibration:(CLLocationManager *)manager
  //區(qū)域監(jiān)聽(tīng)時(shí),進(jìn)入監(jiān)聽(tīng)區(qū)域
 -(void)locationManager:(CLLocationManager *)manager
didEnterRegion:(CLRegion *)region
  //區(qū)域監(jiān)聽(tīng)時(shí),離開(kāi)監(jiān)聽(tīng)區(qū)域
 -(void)locationManager:(CLLocationManager *)manager
didExitRegion:(CLRegion *)region

//定位失敗時(shí)
- (void)locationManager:(CLLocationManager *)manager
didFailWithError:(NSError *)error;

//監(jiān)聽(tīng)區(qū)域失敗
- (void)locationManager:(CLLocationManager *)manager
monitoringDidFailForRegion:(nullable CLRegion *)region
withError:(NSError *)error
//授權(quán)狀態(tài)發(fā)生改變
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
//已經(jīng)開(kāi)始監(jiān)聽(tīng)區(qū)域
- (void)locationManager:(CLLocationManager *)manager
didStartMonitoringForRegion:(CLRegion *)region
//暫停了定位數(shù)據(jù)獲取
- (void)locationManagerDidPauseLocationUpdates:(CLLocationManager *)manager
//恢復(fù)了定位數(shù)據(jù)的獲取
- (void)locationManagerDidResumeLocationUpdates:(CLLocationManager *)manager
 //結(jié)束延遲定位更新時(shí)
 - (void)locationManager:(CLLocationManager *)manager
didFinishDeferredUpdatesWithError:(nullable NSError *)error

 //計(jì)入觀光區(qū)域
 - (void)locationManager:(CLLocationManager *)manager didVisit:(CLVisit *)visit 

實(shí)際應(yīng)用(使用系統(tǒng)的導(dǎo)航)

  - (void)viewWillAppear:(BOOL)animated{
     [super viewWillAppear:animated];
  //1. 創(chuàng)建位置管理器
  self.locationManager = [CLLocationManager new];
 //2>判斷版本,如果大于iOS8需要進(jìn)行授權(quán) ,同時(shí)配置plist文件
 //用戶使用時(shí)授權(quán) 大部分的應(yīng)用應(yīng)該使用此種授權(quán)方式
 // 判斷可以使用宏定義(獲取系統(tǒng)版本號(hào))  / respondsToSelector
 if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
      //使用時(shí)授權(quán)
      [self.locationManager requestWhenInUseAuthorization];
     // 一直授權(quán)
     //[locationManager requestAlwaysAuthorization];
  }
    //3. 設(shè)置代理, 來(lái)獲取數(shù)據(jù)
    self.locationManager.delegate = self;

  //4. 開(kāi)始定位
  // 開(kāi)始定位不要忘記停止定位  //[self.locationManager stopUpdatingLocation]

  [self.locationManager startUpdatingLocation];

 // 為了實(shí)現(xiàn)省電目的,對(duì)定位進(jìn)行優(yōu)化

 //5. 距離篩選器 (當(dāng)用戶發(fā)生一定位置的改變時(shí), 再去調(diào)用代理方法, 以此實(shí)現(xiàn)省電)
 // 值: 多少米  譬如:設(shè)置10, 就代表用戶位置發(fā)生10米以上的偏移時(shí), 才去定位
  self.locationManager.distanceFilter = 10;

//6. 設(shè)置精確度 (減少為衛(wèi)星之間的計(jì)算, 以此實(shí)現(xiàn)省電)
// 定位的方式: GPS 北斗 基站定位 WiFi 定位
// iPhone打開(kāi)定位: GPS 跟24顆衛(wèi)星進(jìn)行通訊
//desired: 期望
//Accurac: 精準(zhǔn)度
//extern const CLLocationAccuracy kCLLocationAccuracyBest;設(shè)備 使用電池供電時(shí)候询兴,最高的精度
//extern const CLLocationAccuracy kCLLocationAccuracyNearestTenMeters;精度10米
//extern const CLLocationAccuracy kCLLocationAccuracyHundredMeters;精度100米
//extern const CLLocationAccuracy kCLLocationAccuracyKilometer;精度1000米
//extern const CLLocationAccuracy kCLLocationAccuracyThreeKilometers;精度3000米
 //kCLLocationAccuracyBestForNavigation   導(dǎo)航情況下最高精度,一般要有外接電源時(shí)才 能使用

  self.locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
}
# pragma mark -懶加載 創(chuàng)建CLGeocoder對(duì)象
-(CLGeocoder *)geo
{
if (!_geo)
{
    _geo = [[CLGeocoder alloc] init];

}
return  _geo;
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{
//獲取到經(jīng)緯度
CLLocation *location = locations.firstObject;

//3. 調(diào)用方法即可
[self.geo reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {

    //3.1 防錯(cuò)處理
    if (placemarks.count == 0 || error) {
        NSLog(@"沒(méi)有數(shù)據(jù)或數(shù)據(jù)解析出錯(cuò)");
        return;
    }

    //3.2 遍歷數(shù)據(jù)
    for (CLPlacemark *pm in placemarks) {

        //3.3. 獲取城市信息, 如果有城市信息就顯示, 否則可以顯示行政區(qū)域
        if (pm.name) {

            self.cityStr = pm.name;
        }else{

            self.cityStr = pm.locality;
        }

    }
}];
}

//添加一個(gè)按鈕,實(shí)現(xiàn)點(diǎn)擊事件,
-(IBAction)startNavigation:(id)sender
  {
  [self.geo  geocodeAddressString:self.cityStr completionHandler:^(NSArray *placemarks, NSError *error) {
   //獲取到起點(diǎn)的MKplaceMark
    MKPlacemark *startPlace = [[MKPlacemark alloc] initWithPlacemark:[placemarks firstObject]];

    //等待獲取到起點(diǎn)的placemarks之后在獲取終點(diǎn)的placemarks,block回調(diào)延遲問(wèn)題
    [self.geo  geocodeAddressString:@"北京市朝陽(yáng)區(qū)東四環(huán)四方橋東南角" completionHandler:^(NSArray *placemarks, NSError *error) {

        /**
         獲取到終點(diǎn)的MKplaceMark,MKPlaceMark 是ClPlaceMark的子類(lèi)。
         */
        MKPlacemark *endPlace = [[MKPlacemark alloc] initWithPlacemark:[placemarks firstObject]];

        /**
         將MKPlaceMark轉(zhuǎn)換成MKMapItem,這樣可以放入到item這個(gè)數(shù)組中

         */
        MKMapItem *startItem = [[MKMapItem alloc ] initWithPlacemark:startPlace];
        MKMapItem *endItem = [[MKMapItem alloc ] initWithPlacemark:endPlace];

        NSArray *item = @[startItem ,endItem];

        //建立字典存儲(chǔ)導(dǎo)航的相關(guān)參數(shù)
        NSMutableDictionary *md = [NSMutableDictionary dictionary];
        md[MKLaunchOptionsDirectionsModeKey] = MKLaunchOptionsDirectionsModeDriving;
        md[MKLaunchOptionsMapTypeKey] = [NSNumber numberWithInteger:MKMapTypeStandard];

        /**
         *調(diào)用app自帶導(dǎo)航,需要傳入一個(gè)數(shù)組和一個(gè)字典哄孤,數(shù)組中放入MKMapItem,
         字典中放入對(duì)應(yīng)鍵值

         MKLaunchOptionsDirectionsModeKey   開(kāi)啟導(dǎo)航模式
         MKLaunchOptionsMapTypeKey  地圖模式
         MKMapTypeStandard = 0,
         MKMapTypeSatellite,
         MKMapTypeHybrid

         // 導(dǎo)航模式
         MKLaunchOptionsDirectionsModeDriving 開(kāi)車(chē);
         MKLaunchOptionsDirectionsModeWalking 步行;
         */ #warning 其實(shí)所有的代碼都是為了下面一句話吹截,打開(kāi)系統(tǒng)自帶的高德地圖然后執(zhí)行某些動(dòng)作,launchOptions里面的參數(shù)指定做哪些動(dòng)作
        [MKMapItem openMapsWithItems:item launchOptions:md];
        }]; 
        }]
        }
- (void)viewWillDisappear:(BOOL)animated
{

  [super viewWillDisappear:animated];

  [self.locationManager stopUpdatingLocation];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市尉共,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蛾默,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,080評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捉貌,死亡現(xiàn)場(chǎng)離奇詭異支鸡,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)趁窃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)牧挣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人醒陆,你說(shuō)我怎么就攤上這事瀑构。” “怎么了统求?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,630評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵检碗,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我码邻,道長(zhǎng),這世上最難降的妖魔是什么另假? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,554評(píng)論 1 284
  • 正文 為了忘掉前任像屋,我火速辦了婚禮,結(jié)果婚禮上边篮,老公的妹妹穿的比我還像新娘己莺。我一直安慰自己,他們只是感情好戈轿,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布凌受。 她就那樣靜靜地躺著,像睡著了一般思杯。 火紅的嫁衣襯著肌膚如雪胜蛉。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,856評(píng)論 1 290
  • 那天色乾,我揣著相機(jī)與錄音誊册,去河邊找鬼。 笑死暖璧,一個(gè)胖子當(dāng)著我的面吹牛案怯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播澎办,決...
    沈念sama閱讀 39,014評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼嘲碱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼金砍!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起麦锯,我...
    開(kāi)封第一講書(shū)人閱讀 37,752評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤恕稠,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后离咐,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體谱俭,經(jīng)...
    沈念sama閱讀 44,212評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評(píng)論 2 327
  • 正文 我和宋清朗相戀三年宵蛀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了昆著。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,687評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡术陶,死狀恐怖凑懂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情梧宫,我是刑警寧澤接谨,帶...
    沈念sama閱讀 34,347評(píng)論 4 331
  • 正文 年R本政府宣布,位于F島的核電站塘匣,受9級(jí)特大地震影響脓豪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜忌卤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評(píng)論 3 315
  • 文/蒙蒙 一扫夜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧驰徊,春花似錦笤闯、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,777評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至牺弹,卻和暖如春浦马,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背例驹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,006評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工捐韩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鹃锈。 一個(gè)月前我還...
    沈念sama閱讀 46,406評(píng)論 2 360
  • 正文 我出身青樓荤胁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親屎债。 傳聞我的和親對(duì)象是個(gè)殘疾皇子仅政,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 出自http://my.oschina.net/are1OfBlog/blog/420034 摘要 現(xiàn)在很多社交垢油、...
    JJO閱讀 4,124評(píng)論 4 19
  • 簡(jiǎn)介 在移動(dòng)互聯(lián)網(wǎng)時(shí)代,移動(dòng)app能解決用戶的很多生活瑣事圆丹,比如 周邊:找餐館滩愁、找KTV、找電影院等等 導(dǎo)航:根據(jù)...
    JonesCxy閱讀 1,188評(píng)論 1 1
  • 作者:柳駿原文地址:http://www.ios520junge.com/ 初學(xué)地圖時(shí)辫封,覺(jué)得地圖是個(gè)很高深的玩意兒...
    行走的蘋(píng)果哥閱讀 1,318評(píng)論 0 4
  • *初學(xué)地圖時(shí)硝枉,覺(jué)得地圖是個(gè)很高深的玩意兒,導(dǎo)航倦微、定位妻味、檢索這得運(yùn)用多少算法和核心動(dòng)畫(huà)的知識(shí)點(diǎn)啊,于是一直排斥 * ...
    柳駿閱讀 3,714評(píng)論 11 22
  • http://www.cnblogs.com/kenshincui/p/4125570.html 摘要: 現(xiàn)在很多...
    大崔老師閱讀 3,278評(píng)論 1 2