iOS 百度地圖 Demo

效果圖

效果圖

效果圖-新增

一、環境設置

1.開發環境:Xocode 7.3.1

2.模擬器環境:iOS 9.3

3.iOS 9 之后不能直接使用 HTTP 進行請求,需要在 Info.plist 新增一段用于控制 ATS 的配置:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

也即:

ATS配置

[站外圖片上傳中……(4)]

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

在這個 Demo 里不需要使用 bitcode 功能,所以設置為了 NO。
[站外圖片上傳中……(5)]

4.導入百度地圖 SDK

百度地圖提供了兩種導入方式,可以直接把 SDK 拖入到工程,也可以使用 CocoaPods ,這里我是用后面一種方式導入百度地圖 SDK。

編輯 Podfile 內容如下:

pod 'BaiduMapKit' #百度地圖SDK

在 Podfile 所在的文件夾下輸入命令:

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 導入的百度地圖,運行之后可能會報錯:
[站外圖片上傳中……(6)]
這時需要進入
[站外圖片上傳中……(7)]
將所有的百度地圖 framework 導入到工程中:
[站外圖片上傳中……(8)]
然后再運行,錯誤解決,會出現下面的錯誤:
[站外圖片上傳中……(9)]
這時進入 info.plist 添加 Bundle display name,如下圖:
[站外圖片上傳中……(10)]
配置百度地圖資源文件:
[站外圖片上傳中……(11)]
[站外圖片上傳中……(12)]
再次運行,控制臺會輸出『設置成功』則說明設置成功了。
[站外圖片上傳中……(13)]

二、代碼

代碼結構:

  • 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 日

新增兩個控制器,分別是 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 可能會遇到下面的問題
[站外圖片上傳中……(14)]
解決辦法如下:
[站外圖片上傳中……(15)]

再次運行就不會報錯了。

3.說明:地圖上的標注抓取的是美團的數據。

說明:
這只是一個簡單的 demo,寫的比較粗糙,大家可以給我留言,需要完成什么樣的功能,如果有時間,我會盡力加上需要的功能,后面我還會繼續更新。謝謝大家的支持!如果你覺得我寫的 demo 對你有所幫助,請在 github 上下載的時候順手給個 star,不勝感激!

下面是 demo 下載地址:

github 下載地址

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,619評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,155評論 3 425
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,635評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,539評論 1 316
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,646評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,655評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,838評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,399評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,146評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,338評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,893評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,565評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,983評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,257評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,059評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,296評論 2 376

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,698評論 25 708
  • 各位小伙伴們大家好,今天我向大家介紹一下蘋果百度地圖的使用方法,因為做過一些想關的APP,感覺百度地圖還是挺方便的...
    Lee0528閱讀 14,741評論 18 46
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,158評論 4 61
  • 圖文整理根據李哲老師之運動解剖學2網課,vivian整理。 p1 第一章 簡介 腿后肌群柔韌度測試(3個高度) 平...
    舒涵vivian閱讀 648評論 0 4
  • 關于作者 基思·斯坦諾維奇,加拿大多倫多大學人類發展與應用心理學教授,曾擔任加拿大應用認知科學首席科學家。2012...
    札記俠閱讀 525評論 0 0