O 需求
將百度地圖加入到IOS應用程序中
一 准備
1)到百度官網下載 iOS SDKv1.2.2 靜態庫。地址如下 http://openapi.baidu.com/map/sdkiosdev-download.htm
2)將靜態庫引入你的工程,具體步驟如下:
引入靜態庫文件 百度MapAPI提供了模擬器和真機兩中環境所使用的靜態庫文件,分別存放在libs/Release-iphonesimulator和libs/Release-iphoneos文件夾下。有兩種方式可以引入靜態庫文件: 第一種方式:直接將對應平台的.a文件拖拽至XCode工程左側的Groups&Files中,缺點是每次在真機和模擬器編譯時都需要重新添加.a文件; 第二種方式:使用lipo命令將設備和模擬器的.a合並成一個通用的.a文件,將合並后的通用.a文件拖拽至工程中即可,具體命令如下: lipo –create Release-iphoneos/libbaidumapapi.a Release-iphonesimulator/libbaidumapapi.a –output libbaidumapapi.a 第三種方式: 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中即可。 引自:http://openapi.baidu.com/map/sdkiosdev-2.htm |
3)引入CoreLocation.framework和QuartzCore.framework
4)為Other Linker Flags 設置-all_load屬性
步驟:選中你的工程。選擇右邊的TARGETS->Build Settings找到Other Linker Flags
二 編碼
1、在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 }
執行后,效果如下:
四 調試
當編譯不成功時,可檢查如下問題
1、 是否已在項目中引入 CoreLocation.framework Quartz.framework MapKit.framework
2、 是否已將任意一個.m文件改為.mm(僅該后綴即可,不涉及其它地方)
3、 是否已為Other Linker Flags 添加-all_load屬性如下圖所示:
或許也可能是這樣:
4、 檢查引入的靜態庫類型是模擬器的還是IOS設備的,是否與當前的編譯模式相同。
5、需要將下載下來的整個百度地圖庫文件引入到開發工程中,而不僅僅只是一個 libbaidumapapi.a 文件。需要引入到工程中的文件清單包括:BaiduMapApi_Lib_iOS_1.2.2 文件夾下的 1 inc 文件夾(全部) 2 libs 文件 (僅真機部分,因為我用的真機測試、開發) 3 mapapi.bundle 文件
6、上述問題和方法都用遍,但在真機調試時仍爆出連接錯誤,通過百度api 將api包把原來的1.2.2版本換位1.2.3版本后,真機調試終於通過!
五 思路
六 分析
百度地圖目前還在改進和更新中,大家不必太迷信它。如果在使用過程中遇到各種怪異的問題,建議先到百度地圖api吧中確認以下是不是百度地圖自身的Bug.
七 疑問
增加:
用lipo命令合成模擬器和真機靜態庫
步驟:1、先 將兩個文件放到同一個文件夾下 2、通過終端terminal 進入目標文件夾 3 使用lipo命令進行合成(如 :lipo -create libbaidumapapis.a libbaidumapapir.a -output libbaidumapapi.a)。過程如下: