iOS百度地圖 Demo

效果圖

效果圖 
效果圖-新增

1、環境設置

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

ATS配置

注: 
bitcode 是 xcode 7 以後新增的配置選項,默認爲 YES,咱們提交程序到 App store 上時,Xcode 會將程序編譯爲一箇中間表現形式(bitcode)。而後 App store 會再將這個 bitcode 編譯爲可執行的 64 位或 32 位程序。github

在這個 Demo 裏不須要使用 bitcode 功能,因此設置爲了 NO。 
bitcode設置爲NOsql

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形式開發包

第一步、根據須要導入 .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 導入的百度地圖,運行以後可能會報錯: 
錯誤1.png
這時須要進入 
解決錯誤1

將全部的百度地圖 framework 導入到工程中: 


AddOther

而後再運行,錯誤解決,會出現下面的錯誤: 


這裏寫圖片描述 
這時進入 info.plist 添加 Bundle display name,以下圖: 
這裏寫圖片描述

配置百度地圖資源文件:

 
這裏寫圖片描述
mapapi_bundle.png 

再次運行,控制檯會輸出『設置成功』則說明設置成功了。 


這裏寫圖片描述

2、代碼

代碼結構:

  • Classess 
    • 百度地圖&路徑規劃
    • 覆蓋物 
      • YMAnnotationViewController - 自定義標註拖動控制器
      • YMAnnotationController - 系統標註拖動控制器
    • 主控制器 
      • YMTableViewController - 剛進入程序的控制器 
        • Controller 
          • YMMapViewController - 百度地圖控制器
          • YMPoiDetailViewController - 店鋪詳情控制器
          • YMRouteAnnotationController - 路徑規劃控制器
        • Model 
          • YMPoi - 店鋪模型
          • YMPointAnnotation - 標註模型
        • View 
          • YMAnnotationView - 標註視圖
          • YMPaopaoView - 點擊標註彈出自定義的泡泡
    • Category 
      • UIImage+Rotate - 路徑規劃界面 image 的擴展

注意: 
1. 須要把 AppDelegate.m 改爲 AppDelegate.mm 文件 
2. 須要把路徑規劃控制也寫成 .mm 後綴,即YMRouteAnnotationController.mm。

新增功能:

2016 年 7 月 5 日

新增兩個控制器,分別是 YMAnnotationViewControllerYMAnnotationController,能夠對自定義的標註和系統的標註進行拖動操做。

百度地圖提供了下面的代理方法:

/**
 *拖動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,不勝感激!

下面是 demo 下載地址:

github 下載地址

源碼下載地址:http://www.jinhusns.com/Products/Download