各位小伙伴們大家好,今天我向大家介紹一下蘋果百度地圖的使用方法,因為做過一些想關的APP,感覺百度地圖還是挺方便的。
首先我們先創建一個工程,創建好了之后,我們繼續來看一下百度地圖的開放平臺
點擊上面個的開發,然后選擇下面的ios地圖SDK,進去之后我們會看到百度地圖的概述:
地圖
(地圖都是一些簡單的功能,只能進行一些查看的簡單操作)
提供地圖展示和地圖操作功能
· 地圖展示包括:普通地圖(2D,3D)、衛星圖和實時交通圖;
· 地圖操作:可通過接口或手勢控制來實現地圖的點擊、雙擊、長按、縮放、旋轉、改變視角等操作。
POI檢索
(POI檢索主要是對周邊或者某個城市,還有一些商家商店,景點地址等搜索)
支持周邊檢索、區域檢索、城市內檢索和Place詳情信息檢索。
·周邊檢索:以某一點為中心,指定距離為半徑,根據用戶輸入的關鍵詞進行POI檢索;
·區域檢索:在指定的矩形區域內、根據關鍵詞進行POI檢索;
·城市內檢索:在某一城市內,根據用戶輸入的關鍵字進行POI檢索;
·Place詳情檢索:根據POI的ID信息,檢索指定POI點的Place詳情數據。
地理編碼
(地理編碼的功能就是根據已個地址名得到它的坐標,或者根據坐標得到地址的名稱,比如我們定位之后,會獲取到我們位置的坐標,然后根據坐標得到我們位置的一些信息,或者來獲取周邊的一些信息等)
提供地理坐標和地址之間相互轉換的能力。
·正向地理編碼:實現了將中文地址或地名描述轉換為地球表面上相應位置的功能;
·反向地理編碼:將地球表面的地址坐標轉換為標準地址的過程。
線路規劃
(線路規劃就是當我們需要去某個地方,我們進行搜索之后就會在地圖上顯示出一條路線來指示我們)
支持公交信息查詢、公交換乘查詢、駕車線路規劃和步行路徑檢索。
·公交信息查詢:可對公交詳細信息進行查詢;
·公交換乘查詢:根據起、終點,查詢策略,進行線路規劃方案;
·駕車線路規劃:提供不同策略,規劃駕車路線;(支持設置途經點)
·步行路徑檢索:支持步行路徑的規劃。
調啟百度地圖
(調起百度地圖,就是在我們自己的App里直接跳到百度地圖的App,如果我們安裝了百度地圖就會開啟百度地圖App,如果我們沒安裝百度地圖App那么它就會在瀏覽器里打開百度地圖)
利用SDK接口,直接在本地打開百度地圖客戶端或WebApp,實現地圖功能。 目前支持調啟的功能有:POI周邊檢索、POI詳情頁面、步行線路規劃、駕車線路規劃、公交線路規劃、駕車導航。(具體請參考開發指南中,計算工具章節內的介紹)
定位
采用iOS系統定位,使用地圖SDK中我的位置圖層進行豐富的位置展示(包括普通態、跟隨態和羅盤態)。
上面都是是我們開發中常用到的一些功能,下面的的功能用的不是特別多
覆蓋物圖層
支持多種覆蓋物圖層,便于顯示POI檢索結果、線路規劃結果、自定義標繪等。 此外還提供特有的圖片圖層,用于顯示用戶傳入的圖片信息。開放熱力圖繪制能力,通過用戶自有數據,繪制屬于自己的熱力圖。 瓦片圖層,支持開發者添加自有瓦片數據
離線地圖
用戶可以通過SDK在線下載離線包接口,下載離線地圖包,使用離線地圖可節省用戶流量,提供更好的地圖展示效果
周邊雷達
周邊雷達功能,是面向移動端開發者的一套SDK功能接口。同步支持Android和iOS端。它的本質是一個連接百度LBS開放平臺前端SDK產品和后端LBS云的中間服務。開發者利用周邊雷達功能,可以便捷的在自己的應用內,幫助用戶實現查找周邊跟“我”使同樣一款App的人,這樣一個功能。
LBS云
百度地圖LBS云是百度地圖針對LBS開發者全新推出的平臺級服務,不僅適用PC應用開發,同時適用移動設備應用的開發。 使用LBS云,可以實現移動開發者存儲海量位置數據的服務器零成本及維護壓力,且支持高效檢索用戶數據,且實現地圖展現。
特色功能
特色功能包括:短串分享、Place詳情檢索等。
·短串分享:將POI搜索結果或反地理編碼結果生成短串,當其他用戶點擊短串即可打開手機上的百度地圖客戶端或者手機瀏覽器進行查看。
·熱力圖繪制:根據用戶自有數據,提供相應繪制接口,實現熱力圖本地繪制;
·Place詳情檢索:根據POI的ID信息,檢索指定POI點的Place詳情數據。
個性化地圖
自v2.10.0起,支持使用個性化地圖模板,改變底圖顏色和樣式。
·使用個性化模板,實現地圖元素的顏色設置,地圖元素包含大地、水系、草地、高速、普通道路、鐵路、地鐵,poi等,以及poi和道路的文字顏色設置。
·通過可見屬性,控制顯示地圖元素。
室內圖
自v3.0版起,百度地圖SDK室內圖功能正式上線,輔助開發者實現全新的地理位置服務體驗,室內地圖與百度地圖App同步更新。
·支持的公眾建筑包含購物商場、機場和火車站等交通樞紐,醫院等,覆蓋全國約600個大型購物中心,覆蓋類型和城市還在持續增加中。
這些都是一些常用的基本功能,下面我們繼續看開發的過程:
首先我們先獲取秘鑰,獲取秘鑰我們就必須要登錄百度賬號,我們可以用QQ、微博、微信或者直接注冊一個賬號,登錄之后呢直接點擊獲取秘鑰,然后我們會看到,如圖:
需要我們注冊開發者,我們在這填寫上姓名,手機號郵箱之后,就可以了,因為我有一個我就直接用我現在的了,直接登錄進入到申請密鑰的界面,可以看到我這里面
百度地圖iOS SDK開發密鑰的申請地址為:http://lbsyun.baidu.com/apiconsole/key
創建了有很多應用,然后我們點擊左邊上面的創建應用,創建一個新的應用方便我們演示;
我們先起個名字,百度地圖Demo,然后點擊下面的應用類型,選擇ios SDK,然后繼續選擇下面的啟用服務,一般用不到的我們會勾選掉,然后繼續下面填寫安全碼,說一下可能第一次用百度地圖的小伙伴不知道這個安全碼在哪找,其實這個安全碼是在我們創建的項目工程里的Bundle identifier,如圖:
根據順序選則,上面選中的就是我們的安全碼,直接拷貝到我們的創建百度應用里面,最后直接提交,就可以了。
創建完應用之后我們會獲取到一個訪問應用的APK
如圖:
這就是我們代碼里所需要的,一會我們會把他粘貼到我們的工程項目里;
下面我們繼續看,首先我們來先看一下簡介:
主要介紹了什么是百度地圖ios SDK,基本功能我們上面已經說過了,還有適用的對象,以及獲取定制的的SDK和兼容性
什么是百度地圖iOS SDK?
百度地圖iOS SDK是一套基于armv7、armv7s、arm64(自v2.5.0版本)處理器設備的應用程序接口,不僅提供構建地圖的基本接口,還提供POI搜索、地理編碼、路線規劃、定位、本地覆蓋物繪制、周邊雷達等服務,自v2.0.0開始為矢量渲染的3D地圖,并新增了矢量離線地圖下載功能接口。
自v2.7.0版本開始,iOS 地圖SDK向廣大開發者提供了 .framework形式的開發包,此種形式配置簡單、使用方便,請廣大開發者使用。自2.9.0版本起,iOS 地圖SDK不再提供 .a形式的開發包!
您可以使用百度地圖iOS SDK開發適用于移動設備的地圖應用,通過接口,您可以輕松訪問百度服務和數據,構建功能豐富、交互性強的地圖應用程序。百度地圖iOS SDK提供的功能如下:
地圖:提供地圖展示和地圖操作功能;
室內圖:提供展示公眾建筑物室內地圖的展示功能;
POI檢索:支持周邊檢索、區域檢索和城市內興趣點檢索;
室內POI檢索:支持設置城市和當前建筑物的室內POI檢索;
地理編碼:提供經緯度和地址信息相互轉化的功能接口;
線路規劃:支持公交、駕車、步行、騎行,四種方式的線路規劃;
覆蓋物圖層:支持在地圖上添加覆蓋物(標注、幾何圖形、熱力圖、地形圖圖層等),展示更豐富的LBS信息;
定位:獲取當前位置信息,并在地圖上展示(支持普通、跟隨、羅盤三種模式);
離線地圖:使用離線地圖可節省用戶流量,提供更好的地圖展示效果;
調啟百度地圖:利用SDK接口,直接在本地打開百度地圖客戶端或WebApp,實現地圖功能;
周邊雷達:利用周邊雷達功能,開發者可在App內低成本、快速實現查找周邊使用相同App的用戶位置的功能;
LBS云檢索:支持查詢存儲在LBS云內的自有數據;
瓦片圖層: 支持在地圖上添加自有瓦片數據。
特色功能:提供短串分享、Place詳情檢索、熱力圖等特色功能,幫助開發者搭建功能更加強大的應用;
獲取定制的SDK
開發者可在百度地圖iOS SDK的下載頁面下載到最新版的地圖SDK,下載地址為:http://developer.baidu.com/map/index.php?title=iossdk/sdkiosdev-download
為了給開發者帶來更優質的地圖服務、滿足開發者靈活使用SDK的需求,百度地圖SDK自v2.3.0起,采用了可定制的形式為用戶提供開發包。百度地圖SDK按功能可分為:基礎地圖、檢索功能、LBS云檢索、定位功能、計算工具、周邊雷達六個部分,開發者可根據自身的實際需求,任意組合這六種功能,點擊下載頁面的“自定義下載”,即可下載相應的開發包來完成自己的應用開發。
基礎地圖:包括基本矢量地圖、衛星圖、實時路況圖和各種地圖覆蓋物(POI搜索結果圖層、路線圖層、自定義圖層、幾何圖形繪制圖層、地形圖圖層、熱力圖、瓦片圖層等),此外還包括各種與地圖相關的操作和事件監聽;
檢索功能:包括POI檢索(周邊、區域、城市內),Place詳情檢索,行政區域檢索,公交信息查詢,路線規劃(駕車、步行、公交、騎行),地理編碼/反地理編碼,在線建議查詢,短串分享等;
LBS云檢索:包括LBS云檢索(周邊、區域、城市內、詳情);
定位功能:獲取當前位置信息;
計算工具:包括計算兩點之間距離、計算矩形面積、坐標轉換、調啟百度地圖客戶端、判斷點和圓/多邊形位置關系、本地收藏夾等功能;
周邊雷達:包含位置信息上傳和檢索周邊相同應用的用戶位置信息功能;
注:本套開發指南是針對默認的全功能包編寫,開發者在使用定制化的SDK進行開發時,請參考開發指南中相對應的章節或從相應開發包中的readme文檔獲取更多信息。
兼容性
百度地圖iOS SDK支持iOS 5.0及以上操作系統,支持armv7、armv7s、arm64(自v2.5.0版本)處理器。
注意事項與配置開發環境
下面再來說一下關鍵的部分,注意事項跟開發環境的配置,我在第一次開發這個百度地圖的時候出現了一些問題,大部分都是因為注意事項這里有的沒有改,從而導致了項目沒有跑起來。
注意事項
1、靜態庫中采用ObjectC++實現,因此需要您保證您工程中至少有一個.mm后綴的源文件(您可以將任意一個.m后綴的文件改名為.mm),或者在工程屬性中指定編譯方式,即在Xcode的Project -> Edit Active Target -> Build Setting 中找到 Compile Sources As,并將其設置為"Objective-C++"
2、如果您只在Xib文件中使用了BMKMapView,沒有在代碼中使用BMKMapView,編譯器在鏈接時不會鏈接對應符號,需要在工程屬性中顯式設定:在Xcode的Project -> Edit Active Target -> Build Setting -> Other Linker Flags中添加-ObjC
3、授權Key的申請:新、舊Key之間不可通用,即新Key只可以使用在v2.0.2及后續版本的SDK中,舊的Key只適用于v2.0.1及之前版本的SDK;如果還沒有授權Key,請 申請密鑰
4、由于iOS9改用更安全的https,為了能夠在iOS9中正常使用地圖SDK,請在"Info.plist"中進行如下配置,否則影響SDK的使用。NSAppTransportSecurityNSAllowsArbitraryLoads
如圖
5、如果在iOS9中使用了調起百度地圖客戶端功能,必須在"Info.plist"中進行如下配置,否則不能調起百度地圖客戶端。
<key>LSApplicationQueriesSchemesbaidumap</key>
? ? ? ? <array>
? ? ? ? ?<string> baidumap</string>
? ? ? ? </array>
如圖(我這里是添加了兩個方便大家看,大家可以根據需要來添加)
6、管理地圖的生命周期:自2.0.0起,BMKMapView新增viewWillAppear、viewWillDisappear方法來控制BMKMapView的生命周期,并且在一個時刻只能有一個BMKMapView接受回調消息,因此在使用BMKMapView的viewController中需要在viewWillAppear、viewWillDisappear方法中調用BMKMapView的對應的方法,并處理delegate,代碼如下:
(void)viewWillAppear:(BOOL)animated
{
[_mapView viewWillAppear];
_mapView.delegate = self; // 此處記得不用的時候需要置nil,否則影響內存的釋放
}
-(void)viewWillDisappear:(BOOL)animated
{
[_mapView viewWillDisappear];
_mapView.delegate = nil; // 不用時,置nil
}
7、自iOS SDK v2.5.0起,為了對iOS8的定位能力做兼容,做了相應的修改,開發者在使用過程中注意事項如下: 需要在info.plist里添加(以下二選一,兩個都添加默認使用NSLocationWhenInUseUsageDescription):
NSLocationWhenInUseUsageDescription ,允許在前臺使用時獲取GPS的描述
NSLocationAlwaysUsageDescription ,允許永久使用GPS的描述
如圖
8、在使用Xcode6進行SDK開發過程中,需要在info.plist中添加:Bundle display name ,且其值不能為空(Xcode6新建的項目沒有此配置,若沒有會造成manager start failed)
9、百度地圖iOS SDK v2.5.0起,對arm64進行了支持適配,開發包體積有所增加。但根據開發者在研發過程中的選擇,最終生成的APP體積并不會發生較大的變化。
10、確認項目中添加mapapi.bundle文件以及添加方法正確,不能刪除或隨意更改其中files文件夾下的內容:
注:mapapi.bundle中存儲了定位、默認大頭針標注View及路線關鍵點的資源圖片,還存儲了矢量地圖繪制必需的資源文件。如果您不需要使用內置的圖片顯示功能,則可以刪除bundle文件中的image文件夾。您也可以根據具體需求任意替換或刪除該bundle中image文件夾的圖片文件。添加方式:將mapapi.bundle拷貝到您的工程目錄,直接將該bundle文件托拽至Xcode工程左側的Groups&Files中即可。若您需要替換定位、指南針的圖標,請保留原文件名稱,否則不顯示替換的新圖片,默認大頭針標注與路線關鍵點的新圖片名稱可自定義名稱。
11、注意BMKManager對象的生命周期管理,在使用地圖SDK期間不能釋放該對象,尤其在arc情況下注意避免提前被自動釋放,否則,該對象一旦被釋放,網絡模塊將不可用,地圖無法加載,檢索失敗。
12、app在前后臺切換時,需要使用下面的代碼停止地圖的渲染和openGL的繪制(V2.10.0后不需要再調用):
- (void)applicationWillResignActive:(UIApplication *)application {
[BMKMapView willBackGround];//當應用即將后臺時調用,停止一切調用opengl相關的操作
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
[BMKMapView didForeGround];//當應用恢復前臺狀態時調用,回復地圖的渲染和opengl相關的操作
}
配置開發環境
概述
百度地圖iOS SDK自v2.7.0版本起,向廣大開發者提供了 .framework形式的SDK開發包,這種形式的開發包配置簡單,使用方便,推薦大家使用
如圖,如果我們對百度地圖還不太熟悉的話,我建議全部下載,我們可以看一下人家的源碼,方便我們開發
自動配置.framework形式開發包(使用CocoaPods)
注:此種方式只支持導入全量包的SDK,包含百度地圖iOS SDK所有功能
一、前提:安裝CocoaPods
在終端輸入
sudo gem install cocoapods
如果安裝成功,會有一個提示
Successfully installed cocoaPods
二、使用CocoaPods導入地圖SDK
在當前工程文件(.xcodeproj)所在文件夾下,打開terminal
1.創建Podfile:
touch Podfile
2.編輯Podfile內容如下:
pod 'BaiduMapKit' #百度地圖SDK
3.在Podfile所在的文件夾下輸入命令:
pod install (這個可能比較慢,請耐心等待……)
成功以后,會出現如下記錄:
Analyzing dependencies
Downloading dependencies
Installing BaiduMapKit (2.9.1)
Generating Pods project
Integrating client project
[!] Please close any current Xcode sessions and use `***.xcworkspace` for this project from now on.
Sending stats
恭喜你已成功導入百度地圖iOS SDK,現在就可以打開xcworkspace文件,在你的項目中使用百度地圖SDK了
手動配置.framework形式開發包
第一步、根據需要導入 .framework包
百度地圖 iOS SDK 采用分包的形式提供 .framework包,請廣大開發者使用時確保各分包的版本保持一致。其中BaiduMapAPI_Base.framework為基礎包,使用SDK任何功能都需導入,其他分包可按需導入。
將所需的BaiduMapAPI_**.framework拷貝到工程所在文件夾下。
在 TARGETS->Build Phases-> Link Binary With Libaries中點擊“+”按鈕,在彈出的窗口中點擊“Add Other”按鈕,選擇BaiduMapAPI_**.framework添加到工程中。
注: 靜態庫中采用Objective-C++實現,因此需要您保證您工程中至少有一個.mm后綴的源文件(您可以將任意一個.m后綴的文件改名為.mm),或者在工程屬性中指定編譯方式,即在Xcode的Project -> Edit Active Target -> Build Setting 中找到 Compile Sources As,并將其設置為"Objective-C++"
第二步、引入所需的系統庫
百度地圖SDK中提供了定位功能和動畫效果,v2.0.0版本開始使用OpenGL渲染,因此您需要在您的Xcode工程中引入CoreLocation.framework和QuartzCore.framework、OpenGLES.framework、SystemConfiguration.framework、CoreGraphics.framework、Security.framework、libsqlite3.0.tbd(xcode7以前為 libsqlite3.0.dylib)、CoreTelephony.framework 、libstdc++.6.0.9.tbd(xcode7以前為libstdc++.6.0.9.dylib)。
(注:紅色標識的系統庫為v2.9.0新增的系統庫,使用v2.9.0及以上版本的地圖SDK,務必增加導入這3個系統庫。)
添加方式:在Xcode的Project -> Active Target ->Build Phases ->Link Binary With Libraries,添加這幾個系統庫即可。
第三步、環境配置
在TARGETS->Build Settings->Other Linker Flags 中添加-ObjC。
如圖
第四步、引入mapapi.bundle資源文件
如果使用了基礎地圖功能,需要添加該資源,否則地圖不能正常顯示mapapi.bundle中存儲了定位、默認大頭針標注View及路線關鍵點的資源圖片,還存儲了矢量地圖繪制必需的資源文件。如果您不需要使用內置的圖片顯示功能,則可以刪除bundle文件中的image文件夾。您也可以根據具體需求任意替換或刪除該bundle中image文件夾的圖片文件。
方法:選中工程名,在右鍵菜單中選擇Add Files to “工程名”…,從BaiduMapAPI_Map.framework||Resources文件中選擇mapapi.bundle文件,并勾選“Copy items if needed”復選框,單擊“Add”按鈕,將資源文件添加到工程中。
第五步、引入頭文件
在使用SDK的類 按需 引入下邊的頭文件:
#import<BaiduMapAPI_Base/BMKBaseComponent.h>//引入base相關所有的頭文件
#import<BaiduMapAPI_Map/BMKMapComponent.h>//引入地圖功能所有的頭文件
#import<BaiduMapAPI_Search/BMKSearchComponent.h>//引入檢索功能所有的頭文件
#import<BaiduMapAPI_Cloud/BMKCloudSearchComponent.h>//引入云檢索功能所有的頭文件
#import<BaiduMapAPI_Location/BMKLocationComponent.h>//引入定位功能所有的頭文件
#import<BaiduMapAPI_Utils/BMKUtilsComponent.h>//引入計算工具所有的頭文件
#import<BaiduMapAPI_Radar/BMKRadarComponent.h>//引入周邊雷達功能所有的頭文件
#import<BaiduMapAPI_Map/BMKMapView.h>//只引入所需的單個頭文件
下面我們就來創建一個地圖
初始化BMKMapManager
在您的AppDelegate.h文件中添加BMKMapManager的定義
@interface BaiduMapApiDemoAppDelegate : NSObject <UIApplicationDelegate>{
UIWindow *window;
UINavigationController *navigationController;
BMKMapManager* _mapManager;
}
在您的AppDelegate.m文件中添加對BMKMapManager的初始化,并填入您申請的授權Key,示例如下
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { ? ? ? // 要使用百度地圖,請先啟動BaiduMapManager
_mapManager = [[BMKMapManager alloc]init];
// 如果要關注網絡及授權驗證事件,請設定 ? ? generalDelegate參數
BOOL ret = [_mapManager start:@"在此處輸入您的授權Key" ?generalDelegate:nil];
if (!ret) {
NSLog(@"manager start failed!");
}
// Add the navigation controller's view to the window and display.
[self.window addSubview:navigationController.view];
[self.window makeKeyAndVisible];
return YES;
}
創建BMKMapView
在您的ViewController.m文件中添加BMKMapView的創建代碼,示例如下
- (void)viewDidLoad {
[super viewDidLoad];
BMKMapView* mapView = [[BMKMapView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
self.view = mapView;
}
自2.0.0起,BMKMapView新增viewWillAppear、viewWillDisappear方法來控制BMKMapView的生命周期,并且在一個時刻只能有一個BMKMapView接受回調消息,因此在使用BMKMapView的viewController中需要在viewWillAppear、viewWillDisappear方法中調用BMKMapView的對應的方法,并處理delegate,代碼如下:
(void)viewWillAppear:(BOOL)animated
{
? ? [_mapView viewWillAppear];
? ? ?_mapView.delegate = self; // 此處記得不用的時候需要置nil,否則影響內存的釋放
}
-(void)viewWillDisappear:(BOOL)animated
{
? ? ? [_mapView viewWillDisappear];
? ? ? _mapView.delegate = nil; // 不用時,置nil
}
編譯,運行,效果如下圖所示:
然后我運行出現了報錯
然后我們看一下出錯的的原因
如果我們不知道這是什么原因的話我們可以吧報錯復制粘貼到百度搜索一下會出現很多解決的方法;
我們先來看一下我這里,跟我們導入的API有關系,我看了一下原來是我那會吧真機測試的API導入了進去,我們重新換掉它來看一下
如圖
然后就可以運行起來了,就是一個簡單的百度地圖;
然后我們也會看到下面提示一個
然后我們在info.plist中添加上就可以了
好了這個就是我們一個簡單的百度開發的流程,我們來總結一下這篇文章:
一:開發流程
1.需要一個百度開發賬號
2.注冊一個新的應用
3.下載百度地圖SDK,添加到項目里
4.配置開發環境
5.調試代碼,能運行起來
二:注意事項
1.首先需要注意上面提到的注意事項,以及開發流程,一定要一步一步來操作,如果有一步出錯就可能會導致我們的項目運行不起來(http://lbsyun.baidu.com/index.php?title=iossdk/guide/attention)
2.還有就是我剛才遇到的,我們導入的API,如果是模擬器的就用模擬器運行,如果是真機的就用真機運行;
另外還有一個有時候會報錯,需要我們修改
如圖
一個簡單的百度地圖開發流程就是這樣的,如果想詳細了解其他的功能,請繼續關注我后期的更新,后期我會繼續把一些其他的功能,如定位,poi檢索,導航等功能給大家寫出來方便大家編寫。
項目源碼地址:https://github.com/Lee0924/BaiDuMap.git
我寫這篇文章希望能幫到大家,如果有寫的不好的地方,希望各位大牛大神給指出來,謝謝!!!