39.iOS百度地圖(手把手教)

  • 一.進(jìn)入百度地圖官方(注冊(cè)應(yīng)用)
  • 1.2.創(chuàng)建應(yīng)用

    FBABCE88-01DC-4183-A8D9-1A84DD0A94AA.png
  • 1.3.具體的應(yīng)用填寫

具體的應(yīng)用填寫
  • 1.4.安全碼(也就是百度地圖的安全碼)
.安全碼(也就是百度地圖的安全碼)

二.iOS地圖開發(fā)

  • 2.1.地圖開發(fā)的選擇類型(根據(jù)自己的需求選擇)


    下載地圖的有關(guān)things
  • 2.2.相關(guān)下載

![相關(guān)下載](http://upload-images.jianshu.io/upload_images/1728484-c3bbc6b87c9df233.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

三.下面真正的進(jìn)行開發(fā)(先實(shí)現(xiàn)地圖的展示)

下面的操作按著這6部分來做
  • 3.1申請(qǐng)秘鑰直接在應(yīng)用里面獲取就好了
應(yīng)用秘鑰
  • 3.2.注意事項(xiàng)(一共12項(xiàng))

  • 3.2.1.靜態(tài)庫(kù)中采用ObjectC++實(shí)現(xiàn),因此需要您保證您工程中至少有一個(gè).mm后綴的源文件(您可以將任意一個(gè).m后綴的文件改名為.mm),或者在工程屬性中指定編譯方式,即在Xcode的Project -> Edit Active Target -> Build Setting 中找到 Compile Sources As,并將其設(shè)置為"Objective-C++"

    3.2.1靜態(tài)庫(kù)中采用ObjectC++實(shí)現(xiàn)
    • 3.2.2.如果您只在Xib文件中使用了BMKMapView,沒有在代碼中使用BMKMapView,編譯器在鏈接時(shí)不會(huì)鏈接對(duì)應(yīng)符號(hào),需要在工程屬性中顯式設(shè)定:在Xcode的Project -> Edit Active Target -> Build Setting -> Other Linker Flags中添加-ObjC
    工程屬性中顯式設(shè)定
    • 3.2.3.授權(quán)Key的申請(qǐng):新、舊Key之間不可通用,即新Key只可以使用在v2.0.2及后續(xù)版本的SDK中,舊的Key只適用于v2.0.1及之前版本的SDK;如果還沒有授權(quán)Key,請(qǐng) 申請(qǐng)密鑰(前面已經(jīng)申請(qǐng)過,在此就不再重復(fù)了)

    • 3.2.4.由于iOS9改用更安全的https,為了能夠在iOS9中正常使用地圖SDK,請(qǐng)?jiān)?Info.plist"中進(jìn)行如下配置,否則影響SDK的使用。

    安全的https
    • 3.2.5.如果在iOS9中使用了調(diào)起百度地圖客戶端功能,必須在"Info.plist"中進(jìn)行如下配置,否則不能調(diào)起百度地圖客戶端。

        <key>LSApplicationQueriesSchemes</key>
          <array>
             <string>baidumap</string>
         </array>
      
      調(diào)起百度地圖客戶端功能
    • 3.2.6.管理地圖的生命周期:自2.0.0起,BMKMapView新增viewWillAppear、viewWillDisappear方法來控制BMKMapView的生命周期,并且在一個(gè)時(shí)刻只能有一個(gè)BMKMapView接受回調(diào)消息,因此在使用BMKMapView的viewController中需要在viewWillAppear、viewWillDisappear方法中調(diào)用BMKMapView的對(duì)應(yīng)的方法,并處理delegate

    管理地圖的生命周期
    • 3.2.7.自iOS SDK v2.5.0起,為了對(duì)iOS8的定位能力做兼容,做了相應(yīng)的修改,開發(fā)者在使用過程中注意事項(xiàng)如下: 需要在info.plist里添加(以下二選一,兩個(gè)都添加默認(rèn)使用NSLocationWhenInUseUsageDescription):
      NSLocationWhenInUseUsageDescription ,允許在前臺(tái)使用時(shí)獲取GPS的描述
      NSLocationAlwaysUsageDescription ,允許永久使用GPS的描述

      GPS定位請(qǐng)求
    • 3.2.8.在使用Xcode6進(jìn)行SDK開發(fā)過程中,需要在info.plist中添加:Bundle display name ,且其值不能為空(Xcode6新建的項(xiàng)目沒有此配置,若沒有會(huì)造成manager start failed)

    3.2.8.Bundle display name
    • 3.2.9.百度地圖iOS SDK v2.5.0起,對(duì)arm64進(jìn)行了支持適配,開發(fā)包體積有所增加。但根據(jù)開發(fā)者在研發(fā)過程中的選擇,最終生成的APP體積并不會(huì)發(fā)生較大的變化。

    • 3.2.10.確認(rèn)項(xiàng)目中添加mapapi.bundle文件以及添加方法正確,不能刪除或隨意更改其中files文件夾下的內(nèi)容:
      注:mapapi.bundle中存儲(chǔ)了定位、默認(rèn)大頭針標(biāo)注View及路線關(guān)鍵點(diǎn)的資源圖片,還存儲(chǔ)了矢量地圖繪制必需的資源文件。如果您不需要使用內(nèi)置的圖片顯示功能,則可以刪除bundle文件中的image文件夾。您也可以根據(jù)具體需求任意替換或刪除該bundle中image文件夾的圖片文件。添加方式:將mapapi.bundle拷貝到您的工程目錄,直接將該bundle文件托拽至Xcode工程左側(cè)的Groups&Files中即可。若您需要替換定位、指南針的圖標(biāo),請(qǐng)保留原文件名稱,否則不顯示替換的新圖片,默認(rèn)大頭針標(biāo)注與路線關(guān)鍵點(diǎn)的新圖片名稱可自定義名稱。

    3.2.10.mapapi.bundle文件以及添加方法

    注意:如果采用的cocopods集成的SDK就不需要導(dǎo)入

    • 3.2.11、注意BMKManager對(duì)象的生命周期管理,在使用地圖SDK期間不能釋放該對(duì)象,尤其在arc情況下注意避免提前被自動(dòng)釋放,否則,該對(duì)象一旦被釋放,網(wǎng)絡(luò)模塊將不可用,地圖無法加載,檢索失敗。

    答: 也就是我們?cè)诙xBMKManager對(duì)象的時(shí)候用strong就好,強(qiáng)引用,防止對(duì)象被釋放掉

    • 3.2.12、app在前后臺(tái)切換時(shí),需要使用下面的代碼停止地圖的渲染和openGL的繪制(V2.10.0后不需要再調(diào)用):

      - (void)applicationWillResignActive:(UIApplication *)application {
          //當(dāng)應(yīng)用即將后臺(tái)時(shí)調(diào)用,停止一切調(diào)用opengl相關(guān)的操作
          [BMKMapView willBackGround];
       }
      - (void)applicationDidBecomeActive:(UIApplication *)application {
          //當(dāng)應(yīng)用恢復(fù)前臺(tái)狀態(tài)時(shí)調(diào)用,回復(fù)地圖的渲染和opengl相關(guān)的操作
          [BMKMapView didForeGround];
      }
      
  • 3.3.配置開發(fā)環(huán)境(cocopods導(dǎo)入手動(dòng)任選一個(gè))

    • ** 第一種cocopods導(dǎo)入**(比較簡(jiǎn)單)

      pod 'BaiduMapKit', '~> 3.1.0'
      

    成功后這些會(huì)被自動(dòng)生成


    成功后這些會(huì)被自動(dòng)生成
    • 第二種: 手動(dòng)配置.framework形式開發(fā)包
    [這個(gè)自己看官方文檔](http://lbsyun.baidu.com/index.php?title=iossdk/guide/buildproject)
    
  • 3.4.集成結(jié)束,下面咱們就使用一下


    百度地圖的調(diào)用
    • 3.4.1.初始化BMKMapManager
      里面包含所有的類名
      導(dǎo)入 #import <BaiduMapAPI_Map/BMKMapComponent.h>
    BMKMapComponent.h包含所有的類名
    • 3.4.2.在您的AppDelegate.h文件中添加BMKMapManager的定義
      @interface AppDelegate () <UIApplicationDelegate>
      {
      BMKMapManager* _mapManager;
      }

      - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
      
       /**
        *   注冊(cè)百度地圖
        */
        // 要使用百度地圖,請(qǐng)先啟動(dòng)BaiduMapManager
        _mapManager = [[BMKMapManager alloc]init];
        // 如果要關(guān)注網(wǎng)絡(luò)及授權(quán)驗(yàn)證事件,請(qǐng)?jiān)O(shè)定 generalDelegate參數(shù)
        BOOL ret = [_mapManager start:@"35WfYq1UDlQoGLgUnHYoK1bklZIYxjeV"  generalDelegate:nil];
      
         if (!ret) {
      
               NSLog(@"開啟失敗");
          }
      

    運(yùn)行之后可能會(huì)報(bào)錯(cuò)

    cocopods導(dǎo)入運(yùn)行之后可能會(huì)報(bào)錯(cuò)

    解決辦法:

    解決辦法:

    再次運(yùn)行就不會(huì)報(bào)錯(cuò)了,但是可能會(huì)開啟失敗

    開啟失敗的解決辦法
    • 3.4.3.開啟成功之后的事(自己創(chuàng)建一個(gè)控制器作為window的根控制器)
自己創(chuàng)建一個(gè)存放mapView的控制器

(1).導(dǎo)入 #import <BaiduMapAPI_Map/BMKMapComponent.h>

(2). 創(chuàng)建BMKMapView對(duì)象

 //寬高的設(shè)置
 #define WIDTH   [UIScreen mainScreen].bounds.size.width
 #define HEIGHT  [UIScreen mainScreen].bounds.size.height
 @property(nonatomic,strong) BMKMapView *bMKMapView;

 -(BMKMapView *)bMKMapView
 {
      if (!_bMKMapView) {
    
        _bMKMapView = [[BMKMapView alloc]initWithFrame:CGRectMake(0, 0, WIDTH, HEIGHT)];
     
        }
     return _bMKMapView;
 }

-(void)viewWillAppear:(BOOL)animated
{
   [self.bMKMapView viewWillAppear];
   self.bMKMapView.delegate = self; // 此處記得不用的時(shí)候需要置nil,否則影響內(nèi)存的釋放
}
-(void)viewWillDisappear:(BOOL)animated
{
   [self.bMKMapView viewWillDisappear];
   self.bMKMapView.delegate = nil; // 不用時(shí),置nil
}

(3).加載地圖

   [self.view addSubview:self.bMKMapView];

到此最簡(jiǎn)單的地圖展示就可以出來了

最簡(jiǎn)單的地圖展示

最簡(jiǎn)單的地圖展示 密碼: srbp

四.實(shí)現(xiàn)百度地圖的周邊搜做功能

簡(jiǎn)單的展示:

百度地圖的周邊搜做功能
  • 4.1.導(dǎo)入靜態(tài)庫(kù)里面的類

     #import <BaiduMapAPI_Search/BMKPoiSearch.h>
     倆代理 一個(gè)地圖代理,一個(gè)搜索代理 <BMKMapViewDelegate,BMKPoiSearchDelegate>
    
靜態(tài)庫(kù)里面的類導(dǎo)入
  • 4.2.加入方法發(fā)起檢索(檢索方法必須放到地圖顯示出來以后)
    否則回報(bào)如下的錯(cuò)


    放在地圖之前報(bào)錯(cuò)
  • 4.3.把檢索的方法寫在地圖顯示之后的代理方法里面
#pragma mark  長(zhǎng)按地圖發(fā)起檢索
-(void)mapview:(BMKMapView *)mapView onLongClick:(CLLocationCoordinate2D)coordinate
{
    //1.初始化檢索對(duì)象(在懶加載里面)
 
    //2.發(fā)起檢索
    BMKNearbySearchOption *option = [[BMKNearbySearchOption alloc]init];
    //當(dāng)前頁碼
    option.pageIndex = 0;
    //每頁顯示的數(shù)據(jù)
    option.pageCapacity = 10;
    option.location = (CLLocationCoordinate2D){39.915, 116.404};
    option.keyword = @"小吃";

    BOOL flag = [self.searcher poiSearchNearBy:option];

   //這mrc的情況,arc不需要
   //[option release];

    if(flag)
   {
        NSLog(@"周邊檢索發(fā)送成功");
   }
   else
   {
       NSLog(@"周邊檢索發(fā)送失敗");
   }
}

有可能錯(cuò)
報(bào)錯(cuò)處理
  • 4.4.數(shù)據(jù)檢索成功之后打印出來


    數(shù)據(jù)檢索成功之后打印出來
  • 4.5.以大頭陣的形式展示出來

          /**
           *  4.添加大頭針
           */
          
          // 添加一個(gè)PointAnnotation
          BMKPointAnnotation* annotation = [[BMKPointAnnotation alloc]init];
          //經(jīng)緯度傳進(jìn)來
          annotation.coordinate = poiInfo.pt;
          //名字傳進(jìn)來
          annotation.title = poiInfo.name;
          //地址傳進(jìn)來
          annotation.subtitle = poiInfo.address;
          //添加大頭針
          [self.bMKMapView addAnnotation:annotation];
    
以大頭陣的形式展示出來

處理辦法:

/**
 *  3.1.修改當(dāng)前顯示區(qū)域
 */
//跨度
BMKCoordinateSpan span = BMKCoordinateSpanMake(0.014383, 0.012235);
//區(qū)域范圍
BMKCoordinateRegion coordinateRegion = BMKCoordinateRegionMake(coordinate, span);
//在地圖上添加區(qū)域
[self.bMKMapView setRegion:coordinateRegion animated:YES];
完整的地圖

封裝好的百度地圖:實(shí)現(xiàn)定位,POI搜索 密碼: xi53

提醒在導(dǎo)入相關(guān)百度地圖的類時(shí),一共有以下幾個(gè)

  #import <BaiduMapAPI_Map/BMKAnnotationView.h>
  #import <BaiduMapAPI_Base/BMKBaseComponent.h>
  #import "BaiduMapAPI_Cloud/BMKCloudSearchComponent.h"
  #import "BaiduMapAPI_Location/BMKLocationComponent.h"
  #import <BaiduMapAPI_Radar/BMKRadarComponent.h>
  #import <BaiduMapAPI_Utils/BMKUtilsComponent.h>
  #import <BaiduMapAPI_Map/BMKMapComponent.h>
  #import <BaiduMapAPI_Search/BMKSearchComponent.h>
  • 有問題一起交流,路過的給個(gè)喜歡,謝謝!!!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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