iOS百度地圖 Demo,ios地圖demo

來源:互聯網
上載者:User

iOS百度地圖 Demo,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>

 

也即:


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

在這個 Demo 裡不需要使用 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-updatepod update --verbose --no-repo-updatepod 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 匯入的百度地圖,運行之後可能會報錯: 

這時需要進入 

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


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


 
這時進入 info.plist 添加 Bundle display name,如: 

配置百度地圖資源檔:

 

 

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


二、代碼代碼結構:
  • 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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.