1.開發環境:Xocode 7.3.1php
2.模擬器環境:iOS 9.3ios
3.iOS 9 以後不能直接使用 HTTP 進行請求,須要在 Info.plist 新增一段用於控制 ATS 的配置:c++
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
也即:git
注:
bitcode 是 xcode 7 以後新增的配置選項,默認爲YES
,咱們提交程序到 App store 上時,Xcode 會將程序編譯爲一箇中間表現形式(bitcode)。而後 App store 會再將這個 bitcode 編譯爲可執行的 64 位或 32 位程序。github
在這個 Demo 裏不須要使用 bitcode 功能,因此設置爲了 NO
。
sql
4.導入百度地圖 SDKapi
百度地圖提供了兩種導入方式,能夠直接把 SDK 拖入到工程,也可使用 CocoaPods ,這裏我是用後面一種方式導入百度地圖 SDK。xcode
編輯 Podfile 內容以下:網絡
pod 'BaiduMapKit' #百度地圖SDK
在 Podfile 所在的文件夾下輸入命令:app
pod install
可是不管是執行 pod install
仍是 pod update
都卡在了 Analyzing dependencies 不動.
若是以前安裝過 CocoaPods,在安裝和更新第三方類庫的時候建議使用下面的語句,這樣不用等太多時間:
pod install --verbose --no-repo-update pod update --verbose --no-repo-update pod install --no-repo-update
第一步、根據須要導入 .framework包
百度地圖 iOS SDK 採用分包的形式提供 .framework包,請廣大開發者使用時確保各分包的版本保持一致。其中BaiduMapAPI_Base.framework 爲基礎包,使用 SDK 任何功能都需導入,其餘分包可按需導入。
將所需的 BaiduMapAPI_XX.framework 拷貝到工程所在文件夾下。
在 TARGETS->Build Phases-> Link Binary With Libaries 中點擊「+」按鈕,在彈出的窗口中點擊 「Add Other」 按鈕,選擇 BaiduMapAPI_XX.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」 按鈕,將資源文件添加到工程中。
使用 cocoaPods 導入的百度地圖,運行以後可能會報錯:
這時須要進入
將全部的百度地圖 framework 導入到工程中:
而後再運行,錯誤解決,會出現下面的錯誤:
這時進入 info.plist 添加 Bundle display name,以下圖:
配置百度地圖資源文件:
再次運行,控制檯會輸出『設置成功』則說明設置成功了。
注意:
1. 須要把 AppDelegate.m 改爲 AppDelegate.mm 文件
2. 須要把路徑規劃控制也寫成 .mm 後綴,即YMRouteAnnotationController.mm。
新增兩個控制器,分別是 YMAnnotationViewController,YMAnnotationController,能夠對自定義的標註和系統的標註進行拖動操做。
百度地圖提供了下面的代理方法:
/** *拖動annotation view時,若view的狀態發生變化,會調用此函數。ios3.2之後支持 *@param mapView 地圖View *@param view annotation view *@param newState 新狀態 *@param oldState 舊狀態 */ - (void)mapView:(BMKMapView *)mapView annotationView:(BMKAnnotationView *)view didChangeDragState:(BMKAnnotationViewDragState)newState fromOldState:(BMKAnnotationViewDragState)oldState;
可是我進行設置的時候上面的方法並不起做用,可能使用的方式不對…
因此我使用了下面的方法:
/** *當選中一個annotation views時,調用此接口 *@param mapView 地圖View *@param views 選中的annotation views */ - (void)mapView:(BMKMapView *)mapView didSelectAnnotationView:(BMKAnnotationView *)view; /** *當取消選中一個annotation views時,調用此接口 *@param mapView 地圖View *@param views 取消選中的annotation views */ - (void)mapView:(BMKMapView *)mapView didDeselectAnnotationView:(BMKAnnotationView *)view;
這樣設置以後,每次在當我點擊的時候大頭針的時候,大頭針處於選中狀態,此次設置大頭針爲開始拖動狀態,而後拖動地圖,取消選中的時候,設置大頭針爲結束拖動狀態。
以下代碼:
/** *當選中一個annotation views時,調用此接口 *@param mapView 地圖View *@param views 選中的annotation views */ - (void)mapView:(BMKMapView *)mapView didSelectAnnotationView:(BMKAnnotationView *)view { // 當選中標註的以後,設置開始拖動狀態 view.dragState = BMKAnnotationViewDragStateStarting; } /** *當取消選中一個annotation views時,調用此接口 *@param mapView 地圖View *@param views 取消選中的annotation views */ - (void)mapView:(BMKMapView *)mapView didDeselectAnnotationView:(BMKAnnotationView *)annotationView { // 取消選中標註後,中止拖動狀態 annotationView.dragState = BMKAnnotationViewDragStateEnding; // 設置轉換的座標會有一些誤差,具體能夠再調節座標的 (x, y) 值 CGPoint dropPoint = CGPointMake(annotationView.center.x, CGRectGetMaxY(annotationView.frame)); CLLocationCoordinate2D newCoordinate = [_mapView convertPoint:dropPoint toCoordinateFromView:annotationView.superview]; [annotationView.annotation setCoordinate:newCoordinate]; /// geo檢索信息類,獲取當前城市數據 BMKReverseGeoCodeOption *reverseGeoCodeOption = [[BMKReverseGeoCodeOption alloc] init]; reverseGeoCodeOption.reverseGeoPoint = newCoordinate; [_geoSearch reverseGeoCode:reverseGeoCodeOption]; }
1.在 AppDelegate.mm 的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
中設置百度地圖管理者,須要在百度地圖 API 控制檯設置 AppKey:
NSString *mapKey = @"x5EHcRvWZm8uzkt3HUpGBQU3"; _mapManager = [[BMKMapManager alloc]init]; // 若是要關注網絡及受權驗證事件,請設定generalDelegate參數 BOOL ret = [_mapManager start:mapKey generalDelegate:nil]; if (ret) { NSLog(@"設置成功!"); }
2.使用 cocoaPods 可能會遇到下面的問題
解決辦法以下:
再次運行就不會報錯了。
3.說明:地圖上的標註抓取的是美團的數據。
說明:
這只是一個簡單的 demo,寫的比較粗糙,你們能夠給我留言,須要完成什麼樣的功能,若是有時間,我會盡力加上須要的功能,後面我還會繼續更新。謝謝你們的支持!若是你以爲我寫的 demo 對你有所幫助,請在 github 上下載的時候順手給個 star,不勝感激!