【iOS開發】如何用 Swift 語言進行LBS應用的開發?

酸奶小妹發表於2015-03-06

本文分為三部分,第一部分詳解用Swift語言開發LBS應用,並給出完整的示例與原始碼;第二部分介紹如何申請LBS金鑰,第三部分是綜合示例檢視,掃描二維碼即可檢視示例demo。

 

第一部分 使用Swift語言開發LBS應用

1、下載iOS地圖SDK的最新版本,地址:http://lbs.amap.com/api/ios-sdk/down/

2、申請LBS金鑰(見第二部分)。

3、xCode新建工程

新建一個 Single View Application 工程。注意:Language 選擇 Swift

 

4、工程配置

a.引入地相簿&搜尋庫

左側目錄中選中工程名,在 TARGETS->Build Phases-> Link Binary With Libaries 中點選“+”按鈕,在彈出的視窗中點選“Add Other”按鈕,選擇解壓後的 MAMapKit.framework 檔案新增到工程中。

 

搜尋庫的新增方法同上。

 

b.引入AMap.bundle資原始檔

AMap.bundle資原始檔中儲存了定位、預設大頭針標註檢視等圖片,可利用這些資源圖片進行開發。

左側目錄中選中工程名,在右鍵選單中選擇Add Files to “工程名”…,從 MAMapKit.framework->Resources 資料夾中選擇 AMap.bundle檔案,並勾選“Copy items if needed”核取方塊,單擊“Add”按鈕,將資原始檔新增到工程中。

 

c.引入系統庫

左側目錄中選中工程名,在TARGETS->Build Settings-> Link Binary With Libaries中點選“+”按鈕,在彈出的視窗中查詢並選擇所需的庫(見下表),單擊“Add”按鈕,將庫檔案新增到工程中。

說明:

備註中,2D表示使用2D柵格地圖需要的系統檔案,3D表示使用3D向量地圖需要的系統檔案、Search表示使用搜尋庫需要的系統檔案。

SystemConfiguration.framework、CoreTelephonySecurity.framework、Security.framework 是為了統計app資訊使用。

 

d.Swift編譯配置

首先:新建橋接標頭檔案(放在工程路徑下),這裡命名為 AMapDemoSwift-Bridging-Header.h,在該標頭檔案中import需要的庫檔案,程式碼如下:

#import <MAMapKit/MAMapKit.h>
#import <AMapSearchKit/AMapSearchAPI.h>

 

然後,左側目錄中選中工程名,在 TARGETS->Build Phases-> Swift Compiler - Code Generation -> Objective-C Briding Header 中輸入橋接檔案的路徑

 

5、地圖的顯示

以3D向量地圖SDK為例,進行介紹。

在 ViewController.swift 中,繼承 MAMapViewDelegate 協議,在 viewDidLoad 方法中配置使用者Key,初始化 MAMapView 物件,並新增到 Subview中。程式碼如下:

let APIKey = "8a1383b14466a8dbf362f44357c496c0"
 
class ViewController: UIViewController , MAMapViewDelegate{
     
    var mapView:MAMapView?
 
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        // 配置使用者Key
        MAMapServices.sharedServices().apiKey = APIKey
         
        // 初始化MAMapView
        initMapView()
    }
     
    func initMapView(){
         
        mapView = MAMapView(frame: self.view.bounds)
         
        mapView!.delegate = self
         
        self.view.addSubview(mapView!)
    }
}

 

執行程式,地圖顯示出來了,就是這樣簡單~

 

6、一個實用的例子

逆地理編碼為例,寫一個完整的示例。實現步驟如下:

(1) 初始化主搜尋物件AMapSearchAPI,並繼承搜尋協議 AMapSearchDelegate 。

(2) 構造 Request 物件,配置搜尋引數。

(3) 通過主搜尋物件以 Request 物件為引數,發起搜尋。

(4) 實現搜尋協議中對應的回撥函式,通過解析 Response 物件獲取搜尋結果。

 

通過定位獲取當前位置的經緯度,在點選定位標註(小藍點)時,進行逆地理編碼,在彈出的氣泡中顯示定位點的地址。實現該場景有以下幾個步驟:

1.開啟定位,顯示定位標註(小藍點)。

2.在定位的回撥函式中獲取定位點的經緯度。

3.點選定位標註,執行逆地理編碼查詢。

4.在逆地理編碼回撥中設定定位標註的title和subtitle。

 

全部原始碼:

import UIKit
 
let APIKey = "8a1383b14466a8dbf362f44357c496c0"
 
class ViewController: UIViewController ,MAMapViewDelegate, AMapSearchDelegate{
     
    var mapView:MAMapView?
    var search:AMapSearchAPI?
    var currentLocation:CLLocation?
 
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
         
        MAMapServices.sharedServices().apiKey = APIKey
         
        initMapView()
         
        initSearch()
    }
     
    func initMapView(){
         
        mapView = MAMapView(frame: self.view.bounds)
         
        mapView!.delegate = self
         
        self.view.addSubview(mapView!)
         
        let compassX = mapView?.compassOrigin.x
         
        let scaleX = mapView?.scaleOrigin.x
         
        //設定指南針和比例尺的位置
        mapView?.compassOrigin = CGPointMake(compassX!, 21)
 
        mapView?.scaleOrigin = CGPointMake(scaleX!, 21)
         
        // 開啟定位
        mapView!.showsUserLocation = true
          
        // 設定跟隨定位模式,將定位點設定成地圖中心點
        mapView!.userTrackingMode = MAUserTrackingModeFollow
         
    }
     
    // 初始化 AMapSearchAPI
    func initSearch(){
        search = AMapSearchAPI(searchKey: APIKey, delegate: self); 
    }
     
    // 逆地理編碼
    func reverseGeocoding(){
         
        let coordinate = currentLocation?.coordinate
 
        // 構造 AMapReGeocodeSearchRequest 物件,配置查詢引數(中心點座標)
        let regeo: AMapReGeocodeSearchRequest = AMapReGeocodeSearchRequest()
         
        regeo.location = AMapGeoPoint.locationWithLatitude(CGFloat(coordinate!.latitude), longitude: CGFloat(coordinate!.longitude))
         
        println("regeo :\(regeo)")
 
        // 進行逆地理編碼查詢
        self.search!.AMapReGoecodeSearch(regeo)
         
    }
     
    // 定位回撥
    func mapView(mapView: MAMapView!, didUpdateUserLocation userLocation: MAUserLocation!, updatingLocation: Bool) {
        if updatingLocation {
            currentLocation = userLocation.location         
        }
    }
     
    // 點選Annoation回撥
    func mapView(mapView: MAMapView!, didSelectAnnotationView view: MAAnnotationView!) {
        // 若點選的是定位標註,則執行逆地理編碼
        if view.annotation.isKindOfClass(MAUserLocation){
            reverseGeocoding()
        }
    }
     
    // 逆地理編碼回撥
    func onReGeocodeSearchDone(request: AMapReGeocodeSearchRequest!, response: AMapReGeocodeSearchResponse!) {
        println("request :\(request)")
        println("response :\(response)")
         
        if (response.regeocode != nil) {
             
            var title = response.regeocode.addressComponent.city
             
            var length: Int{
                return countElements(title)
            }
             
            if (length == 0){
                title = response.regeocode.addressComponent.province
            }
            //給定位標註的title和subtitle賦值,在氣泡中顯示定位點的地址資訊      
            mapView?.userLocation.title = title
            mapView?.userLocation.subtitle = response.regeocode.formattedAddress
        }
 
    }
}

 

全部原始碼下載:https://github.com/hadesh/MyRoute

 

第二部分 如何申請LBS金鑰

1、訪問申請KEY地址:http://lbs.amap.com/console/key/

2、輸入真實應用名稱,選擇iOS SDK平臺服務。

3、獲取Bundle Indentifier

獲取方式一、程式碼獲取

NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];

獲取方式二、Xcode切換到General標籤,檢視Bundle Identifier

4、點選獲取KEY按鈕。

 

第三部分 檢視示例

 

 

---------------------------------------------------------------------------------------------------------------------------------

即日起至2016/10/31止,凡註冊成為高德開發者的新使用者,即可獲贈1張阿里雲優惠券,可享受最低6折購買阿里雲產品。數量有限,發完即止。詳情點選:http://lbsbbs.amap.com/forum.php?mod=viewthread&tid=20143

---------------------------------------------------------------------------------------------------------------------------------

 

相關文章