iOS百度地圖 Demo

来源:http://www.cnblogs.com/yihoudangxian/archive/2017/11/17/7850053.html
-Advertisement-
Play Games

效果圖 一、環境設置 1.開發環境:Xocode 7.3.1 2.模擬器環境:iOS 9.3 3.iOS 9 之後不能直接使用 HTTP 進行請求,需要在 Info.plist 新增一段用於控制 ATS 的配置: 也即: 註: bitcode 是 xcode 7 之後新增的配置選項,預設為 YES, ...


效果圖

效果圖 
效果圖-新增

一、環境設置

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配置

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

在這個 Demo 里不需要使用 bitcode 功能,所以設置為了 NO。 
bitcode設置為NO

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 導入的百度地圖,運行之後可能會報錯: 
錯誤1.png
這時需要進入 
解決錯誤1

將所有的百度地圖 framework 導入到工程中: 


AddOther

然後再運行,錯誤解決,會出現下麵的錯誤: 


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

配置百度地圖資源文件:

 
這裡寫圖片描述
mapapi_bundle.png 

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


這裡寫圖片描述

二、代碼

代碼結構:

  • 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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ...
  • 要成為高產、高效的Web開發者,這需要我們做很多工作,來提高我們的工作方式,以及改善我們的勞動成果。 下麵是10個提高效率的步驟,雖然不能保證解決你在開發中的所有問題,但至少是非常實用的,可以簡化你的Web開發流程,使開發的每一個環節快速、流暢。還可以幫助你節省大量的時間,以便開發更多、更好的項目。 ...
  • 本文以一個小例子簡單介紹微信小程式開發的相關內容,希望共同學習進步。 ...
  • 今天寫登錄註冊頁面,點擊登錄頁面的“註冊”按鈕後軟體突然崩潰,直接閃退,因為是新手,只能去網上搜。雖然網上解決方法眾多,但也沒找到可行的。想起來可以看Logcat,馬上重新運行應用,查看崩潰時的日誌,發現日誌比較多,還都不認識,只好又複製日誌上網搜索,無果。突發奇想,把註冊頁面有關Toolbar的內 ...
  • 1.ViewController .m 頭部代理 代理方法 2.KKViewController(目標ViewController) 新建一個KKViewController .h .m 頭部代理 手勢代理方法 效果圖 ...
  • RecyclerView做的一個輪播效果,適配器有視圖緩存,避免了一些記憶體問題 首先是藉助 PagerSnapHelper 讓RecyclerView每次只滑動一個,然後添加一個指示器,這裡指示器是動態生成的,自己做了個簡單的view 很簡單的一個效果,直接上代碼 public class Imag ...
  • iOS7 topLayoutGuide/bottomLayoutGuide 創建一個叫做LayoutGuideStudy的工程,我們打開看一下Main.storyboard: storyboard-top_bottom_layoutGuide.png 可以看到View Controller下麵出現t ...
  • 隨著社會經濟的發展,車輛已經成了城鎮居民的必需品,而查駕駛證違章記錄、繳納違章罰款,也已經成了人們的生活常態了。而移動互聯的飛速發展,讓這些以前需要跑銀行、跑交警大隊的事項,如今通過手機APP就能解決了。但是手機APP也有讓人困擾的地方,那就是手動輸入駕駛證信息非常繁瑣,且操作容易出現錯誤,不過當手 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...