一 集成百度地圖最終的效果
二 知識點
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("抱歉,未找到結果")
}
}
}