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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...