集成百度地圖SDK(swift) – iPhone手機開發 iPhone軟體開發教學課程

一 集成百度地圖最終的效果

這裡寫圖片描述

二 知識點

1 信息檢索

2 地圖大頭針和導航SDK

三 集成百度地圖SDK

1 百度搜索百度地圖SDK

這裡寫圖片描述

2 註冊賬號(盡量)–>如果沒有賬號,最好去註冊一個賬號(我這裡就不細說註冊賬號的步驟瞭)

3 由於我們要做的是和百度地圖相關的,所以直接按照下面圖片點擊即可(這裡我將一一介紹ios中地圖的相關開發)

這裡寫圖片描述

4 點擊ios地圖SDK裡面是一些相關概述

5 按照圖片點擊進入下面

這裡寫圖片描述

6 相關解釋

6.1 一般我們都是直接點擊”全部下載”
6.2 解釋 : “Bitcode版”是什麼意思:在上架的時候,如果勾選瞭bitcode版,那麼在上架打包的時候,把包發送到contect裡面(管理所有的應用程序),就可以上傳到app store瞭,用戶就可以來下載瞭.但是有一個弊端,如果手機應用既適配瞭4也適配瞭6p,4使用的圖片是使用2x,6p使用的是3x的圖片.如果是以前的情況,是將所有的都打包發送,裡面的所有資源都包括.但是如果你的手機是4s,那麼就會造成空間浪費.Bitcode的作用就是進行解包,就是根據手機相應的類型來給用戶對於的圖片,這樣大大的減小瞭應用的大小.但是並不是所有的SDK都支持Bitcode,如果在集成第三方框架的時候,有可能會報Bitcode的錯誤.這樣怎麼辦呢?(把下面改成NO就可以瞭).

這裡寫圖片描述

7 自定義下載(如果你隻想做其中一種功能的話,就才用自定義下載)

這裡寫圖片描述

8 點擊全部下載

9 獲取秘鑰

這裡寫圖片描述

10 創建應用(點擊提交)

這裡寫圖片描述

11 將獲取到的key保存起來(1Yl6AGhTBKPupy4fM6pTHGO6sFIoTtzi)

這裡寫圖片描述

12 點擊開發,回到概述,查看開發指南相關信息,點擊註意事項

這裡寫圖片描述

13 什麼時候會使用到-ObjC?當SDK或者靜態庫使用到分類,那麼需要使用-ObjC來讓他們之間產生鏈接(註意書寫).按照上面的路徑填寫在Xcode的Project -> Edit Active Target -> Build Setting -> Other Linker Flags中添加-ObjC

14 在info.plist中配置信息

這裡寫圖片描述

15 將下載好的百度SDK添加到工程當中

這裡寫圖片描述
這裡寫圖片描述

16 按照步驟,導入系統的庫文件

這裡寫圖片描述
這裡寫圖片描述

17 導入完成後的結果

這裡寫圖片描述

18 引入mapapi.bundle資源文件

這裡寫圖片描述

19 mapapi.bundle位置: (在下載的百度SDK庫中)

這裡寫圖片描述

20 在15步驟中是否已經導入瞭mapapi.bundl需要用的資源包?沒有,因為,如果我們是將15步驟中下載的SDK需要用到的東西一次性導入的話,就不會導入mapapi.bundl,需要我們一個一個添加才可以.

這裡寫圖片描述

21 由於我們是采用swift的,所以,如果用到OC需要橋接;導入頭文件(記住:頭文件裡面有一處錯誤)

這裡寫圖片描述

二 該部分相關的代碼

1 百度代碼OC視圖

這裡寫圖片描述

//懶加載
    private lazy var mapManager :BMKMapManager = {
       return BMKMapManager()
    }()

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        //如果需要關註網絡及授權驗證事件,請設定generalDelegate參數
        let ret = mapManager.start("1Yl6AGhTBKPupy4fM6pTHGO6sFIoTtzi", generalDelegate: nil)
        if ret == false {
            print("manager start failed!")
        }
        return true
    }

2 該部分寫好代碼後,需要考慮的是要用什麼來展示地圖?

—-> 1.1 解答 : 通過查看BMKMapView我們知道它是繼承UIView的,那麼我們可以往storyboard中拖一個UIView,然後讓其類型等於BMKMapView就可以展示瞭.

3 運行時候彈出的錯誤 : (這個在百度API中註意事項也有說明,隻要配置下info.plist就可以瞭)

這裡寫圖片描述

三 信息檢索

1 檢索行為 : 檢索周邊區域有什麼小吃,電影院,賓館等

2 信息檢索位置

這裡寫圖片描述

3 檢索代碼

—-> 3.1 懶加載和代理相關定義
class ViewController: UIViewController {
    //展示地圖的view
    @IBOutlet weak var mapView: BMKMapView!
    //懶加載
    private lazy var searcher : BMKPoiSearch = {
        //初始化檢索對象
        let searcher = BMKPoiSearch()
        //設置代理
        searcher.delegate = self
        return searcher
    }()

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        mapView.delegate = self
    }

    override func viewWillDisappear(animated: Bool) {
        super.viewWillAppear(animated)
        //將代理設置為nil,以免占用內存
        mapView.delegate = nil
    }
}
—-> 3.2 代理方法實現和判斷是否檢索成功
///MARK: - 實現代理方法(當用戶長按的時候回調用)
extension ViewController : BMKMapViewDelegate {
    func mapview(mapView: BMKMapView!, onLongClick coordinate: CLLocationCoordinate2D) {
        //發起檢索
        let option = BMKNearbySearchOption()
        //檢索的第幾頁
        option.pageIndex = 0
        //每頁檢索的數量
        option.pageCapacity = 20
        //檢索的區域
        option.location = CLLocationCoordinate2DMake(39.915, 116.404)
        //檢索的關鍵字
        option.keyword = "電影"
        //開始檢索
        let flag = searcher.poiSearchNearBy(option)
        if flag {
            print("周邊檢索發送成功")
        }else {
            print("周邊檢索發送失敗")
        }
    }
}
—-> 3.3 結果回調
extension ViewController : BMKPoiSearchDelegate {
    func onGetPoiResult(searcher: BMKPoiSearch!, result poiResult: BMKPoiResult!, errorCode: BMKSearchErrorCode) {
        if errorCode == BMK_SEARCH_NO_ERROR {
            //處理正常結果
            print("獲取到數據")
        }else if errorCode == BMK_SEARCH_AMBIGUOUS_KEYWORD {
            print("起始點有歧義")
        }else {
            print("抱歉,未找到結果")
        }
    }
}

4 註意一 : 如果按照百度上面提供的代碼書寫位置,是有問題的.因為當view還沒加載完畢的時候,就去請求檢索瞭,這是不會成功的.(修改書寫位置)

5 註意二 : 需要在view將要消失的時候,將代理賦值為空,否則會影響內存

四 導航SDK

1 點擊下面圖片,進入導航SDK界面

這裡寫圖片描述

2 獲取秘鑰(該部分在前面已經獲取瞭,這裡不需要再重新獲取)

3 在下圖的地方下載導航的SDK

這裡寫圖片描述

4 將下載好的第三方導航SDK文件導入app中

這裡寫圖片描述

5 導入相關框架

這裡寫圖片描述

6 SDK導入工程中,編譯後仍舊會報錯,這是我們隻需要設置下面圖片就可以瞭,現在基本都是ARC模式.如果是非ARC模式下,就需要按照這樣配置在Build Settings中, “Other Linker Flags”添加“-ObjC” 標識

—-> 6.1 ARC模式配置

這裡寫圖片描述

—-> 6.2 非ARC模式配置

這裡寫圖片描述

7 在info.plist文件中進行相關配置(前後臺設置)

8 將#import “BNCoreServices.h”導入橋接文件中

五 地圖大頭針和導航代碼(該部分不好說,我直接給大傢寫上總體代碼瞭)

//點彈框時調用該方法
    func mapView(mapView: BMKMapView!, annotationViewForBubble view: BMKAnnotationView!) {
        //獲取當前大頭針的坐標
        let coodinate = view.annotation.coordinate

        //節點數組
        var nodesArray = [BNRoutePlanNode]()
        //起點
        let startNode = BNRoutePlanNode()
        startNode.pos = BNPosition()
        startNode.pos.x = coodinate.longitude
        startNode.pos.y = coodinate.latitude + 0.1
        startNode.pos.eType = BNCoordinate_BaiduMapSDK
        nodesArray.append(startNode)

        //終點
        let endNode = BNRoutePlanNode()
        endNode.pos = BNPosition()
        endNode.pos.x = coodinate.longitude
        endNode.pos.y = coodinate.latitude
        endNode.pos.eType = BNCoordinate_BaiduMapSDK
        nodesArray.append(endNode)

        //發起路徑規劃
        BNCoreServices.RoutePlanService().startNaviRoutePlan(BNRoutePlanMode_Recommend, naviNodes: nodesArray, time: nil, delegete: self, userInfo: nil)
    }

    //區域發生改變會調用該方法
    func mapView(mapView: BMKMapView!, regionDidChangeAnimated animated: Bool) {
        print(mapView.region.span)
    }
}

extension ViewController : BNNaviRoutePlanDelegate {
    func routePlanDidFinished(userInfo: [NSObject : AnyObject]!) {
        BNCoreServices.UIService().showNaviUI(BN_NaviTypeSimulator, delegete: nil, isNeedLandscape: true)
    }
}

extension ViewController : BMKPoiSearchDelegate {
    func onGetPoiResult(searcher: BMKPoiSearch!, result poiResult: BMKPoiResult!, errorCode: BMKSearchErrorCode) {
        if errorCode == BMK_SEARCH_NO_ERROR {
            //處理正常結果
            let poiInfos = poiResult.poiInfoList as! [BMKPoiInfo]
            //遍歷
            for poiInfo in poiInfos {
                //添加一個PointAnnotation
                let annotation = BMKPointAnnotation()
                annotation.coordinate = poiInfo.pt
                annotation.title = poiInfo.name
                annotation.subtitle = poiInfo.address
                //添加大頭針
                mapView.addAnnotation(annotation)
            }
        }else if errorCode == BMK_SEARCH_AMBIGUOUS_KEYWORD {
            print("起始點有歧義")
        }else {
            print("抱歉,未找到結果")
        }
    }
}

1 將代碼寫完後運行,報錯,下面顯示的是錯誤信息.

這裡寫圖片描述

—-> 1.1 解決 : 沒有開啟後臺模式,直接開啟後臺模式

這裡寫圖片描述

2 遺留的兩個問題

—-> 2.1 彈框提示TTS失敗?
—-> 2.2 導航的過程中沒有聲音 : 到開發文檔中點擊語音播報,創建應用填入bundleID 以及key

3 解決問題一 :(語音播報)

—-> 3.1 :

這裡寫圖片描述

—-> 3.2 :

這裡寫圖片描述

—-> 3.3 :

這裡寫圖片描述

4 解決問題二 : (彈框失敗)

這裡寫圖片描述

六 總結

1 該部分可以說是一個完整的集成第三方庫實現的地圖導航,裡面有些問題解決的並不是很好,希望看到我博客的同門能給我提出一些建議,或者我們可以一起討論.

2 最後,如果大傢覺得我寫的博客還行,麻煩大傢多多關註我的官方博客,謝謝!!!!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *