O 需求ios
將百度地圖加入到IOS應用程序中api
一 準備iphone
1)到百度官網下載 iOS SDKv1.2.2 靜態庫。地址以下 http://openapi.baidu.com/map/sdkiosdev-download.htm測試
2)將靜態庫引入你的工程,具體步驟以下:ui
引入靜態庫文件編碼
百度MapAPI提供了模擬器和真機兩中環境所使用的靜態庫文件,分別存放在libs/Release-iphonesimulator和libs/Release-iphoneos文件夾下。有兩種方式能夠引入靜態庫文件:spa
第一種方式:直接將對應平臺的.a文件拖拽至XCode工程左側的Groups&Files中,缺點是每次在真機和模擬器編譯時都須要從新添加.a文件;.net
第二種方式:使用lipo命令將設備和模擬器的.a合併成一個通用的.a文件,將合併後的通用.a文件拖拽至工程中即 可,具體命令以下: lipo –create Release-iphoneos/libbaidumapapi.a Release-iphonesimulator/libbaidumapapi.a –output libbaidumapapi.a調試
第三種方式:code
1.將API的libs文件夾拷貝到您的Application工程跟目錄下
2.在XCode的Project -> Edit Active Target -> Build -> Linking -> Other Linker Flags中添加-lbaidumapapi
3.設置靜態庫的連接路徑,在XCode的Project -> Edit Active Target -> Build -> Search Path -> Library Search Paths中添加您的靜態庫目錄,好比"$(SRCROOT)/../libs/Release$(EFFECTIVE_PLATFORM_NAME)",$(SRCROOT)宏表明您的工程文件目錄,$(EFFECTIVE_PLATFORM_NAME)宏表明當前配置是OS仍是simulator
注:靜態庫中採用ObjectC++實現,所以須要您保證您工程中至少有一個.mm後綴的源文件(您能夠將任意一個.m後綴的文件更名爲.mm 注意 在修改過程當中,必定要區分中文下的m和英文下的m,若是你爲文件後綴添加了一箇中文下的m,那麼你的文件將會報缺失,變紅。), 或者在工程屬性中指定編譯方式,即將XCode的Project -> Edit Active Target -> Build -> GCC4.2 - Language -> Compile Sources As設置爲"Objective-C++"
引入mapapi.bundle資源文件
該步驟爲可選,mapapi.bundle中存儲了定位、默認大頭針標註View及路線關鍵點的資源圖片。若是您不須要使用內置的圖片顯示功能,則 能夠不添加此bundle文件。您也能夠根據具體需求任意替換或刪除該bundle中的圖片文件。 添加方式:將mapapi.bundle拷貝到您的工 程目錄,直接將該bundle文件託拽至XCode工程左側的Groups&Files中便可。
3)引入CoreLocation.framework和QuartzCore.framework
4)爲Other Linker Flags 設置-all_load屬性
步驟:選中你的工程。選擇右邊的TARGETS->Build Settings找到Other Linker Flags
二 編碼
一、在ViewController.h中添加以下代碼
1 #import <UIKit/UIKit.h>2 #import "BMapKit.h"3 @interface ViewController : UIViewController<BMKGeneralDelegate>4 {5 BMKMapManager *_mapManager; 6 }7 @end
在ViewController.mm中添加以下代碼 (注:個人工程是將ViewController.m的後綴改成了.mm)
1 - (void)viewDidLoad 2 { 3 [superviewDidLoad]; 4 // Do any additional setup after loadingthe view, typically from a nib. 5 6 //啓動BMKMapManager (加載百度地圖前,必須先啓動BMKMapManager) 7 _mapManager = [[BMKMapManageralloc]init]; 8 BOOL ret = [_mapManagerstart:@"2772BD5CAFF652491F65707D6D5E9ABEBF3639CC"generalDelegate:self]; 9 if (!ret) {10 NSLog(@"manager start failed!");11 }12 13 //建立一張百度地圖14 BMKMapView* mapView = [[BMKMapViewalloc]initWithFrame:CGRectMake(0,0, 320,480)];15 [self.viewaddSubview:mapView];16 }
執行後,效果以下:
四 調試
當編譯不成功時,可檢查以下問題
一、 是否已在項目中引入 CoreLocation.framework Quartz.framework MapKit.framework
二、 是否已將任意一個.m文件改成.mm(僅該後綴便可,不涉及其它地方)
三、 是否已爲Other Linker Flags 添加-all_load屬性以下圖所示:
或許也多是這樣:
四、 檢查引入的靜態庫類型是模擬器的仍是IOS設備的,是否與當前的編譯模式相同。
五、須要將下載下來的整個百度地圖庫文件引入到開發工程中,而不只僅只是一個 libbaidumapapi.a 文件。須要引入到工程中的文件清單包括:BaiduMapApi_Lib_iOS_1.2.2 文件夾下的 1 inc 文件夾(所有) 2 libs 文件 (僅真機部分,由於我用的真機測試、開發) 3 mapapi.bundle 文件
六、上述問題和方法都用遍,但在真機調試時仍爆出鏈接錯誤,經過百度api 將api包把原來的1.2.2版本換位1.2.3版本後,真機調試終於經過!
五 思路
六 分析
百度地圖目前還在改進和更新中,你們沒必要太迷信它。若是在使用過程當中遇到各類怪異的問題,建議先到百度地圖api吧中確認如下是否是百度地圖自身的Bug.
七 疑問
增長:
用lipo命令合成模擬器和真機靜態庫
步驟:一、先 將兩個文件放到同一個文件夾下 二、經過終端terminal 進入目標文件夾 3 使用lipo命令進行合成(如 :lipo -create libbaidumapapis.a libbaidumapapir.a -output libbaidumapapi.a)。過程以下: