IOS-ProgrammingSwiftSwift开发实战

Swift 调用百度地图导航SDK (图文讲解)

2016-03-15  本文已影响3405人  _swift_

Swift 3.0基础框架快速开发开源框架(http://www.jianshu.com/p/0f950c180cb8)
版本说明:本文讲的内容所使用的是Xcode版本是7.2版本 Swift是2.1版本。

1.第一部申请百度开发者 如下图:申请成功

6B377037-980B-461D-A512-9AF2BC365EDB.png
2.再次打开 http://lbsyun.baidu.com 选择->开发->IOS导航SDK 如下图: 7555B3C9-7ED5-4425-BCA5-7255EAA00535.png 7B302071-165C-4422-A809-A6E371E7D6DF.png 7B659036-2E7C-472A-9F51-56C0B2823FB7.png

3.导航的SDK已经下载完毕

 演示SDK版本是V2.0.6 

4.再次回到 http://lbsyun.baidu.com 选择申请密匙->创建应用

55033B3A-1914-4B1D-8C1A-0947CD2DB557.png BD958661-C4F9-44AB-A46E-273BA1457B2D.png 40BCFEA6-E310-429C-9808-2E5FE646F0A0.png

5.提交完成后是这样的

BF2221B5-8E75-4B10-B1C0-523608269D1B.png

6.好了以上申请Key已经完成了,打开你的Xcode吧 创建你的IOS应用吧

------------------------这里是分割线--------------------------------

7.先做个简单的起点和终点的界面 如下图:

919A40F0-FDE7-4477-982D-5337EEF3556C.png

8.把下载好的SDK导入到当前Xcode工程下:如下图


0B486EE5-4CFF-47AA-B5F1-8AD943B7D4D5.png C40F0CFB-66F3-4D09-9BB2-C1AB3E9FC143.png AC033474-2F86-4C49-81F0-FC9D29FB5C56.png

8.此时我们的目录是这样的


9BDA2491-FD1D-4F63-BDB2-474DA64F4F96.png

9.我们运行下,看看能不能运行 如下图:


D08E9DB8-F44C-4A9D-BDAD-DF8EAFDC0C68.png
10.是不是一堆错误?怎么解决呢,跟我一步步做(导致错误的是因为ARC的原因,具体我也不懂) 7E728EB8-17A5-41B2-B339-671E4C3F8F94.png

11.是不是在运行,可以跑起来了?,既然可以跑起来了,那么我们就开始调用SDK导航了 , 首先先做个OC跟Swift桥接库(如何桥接 OC跟swift 这个百度吧 很多了 不一一介绍了), 现在我们的目录是这样的,运行一下,是不是一样可以运行,如果可以证明你步骤对了

#import "BNRoutePlanModel.h"
#import "BNCoreServices.h" 
7112CBC2-4F65-48C1-A00C-2BA4E2FAC091.png

12.好了,我们在新建一个BaiduNavViewController.swift(来看看我们的结构)需要实现百度导航的协议 如下图:


import UIKit

class BaiduNavViewController: UIViewController, BNNaviUIManagerDelegate,BNNaviRoutePlanDelegate{
    
    var Begin_longitude:Double=0.0  //初始点X
    var Begin_latitude:Double=0.0   //初始点Y
    
    private var  longitude=CLLocationDegrees()  //初始点经度
    private var latitude=CLLocationDegrees()     //初始点纬度
    override func viewDidLoad() {
        super.viewDidLoad()
        longitude = Begin_longitude   //起点经度
        latitude =  Begin_latitude    //起点纬度
    }
    //算路回调成功
    func routePlanDidFinished(userInfo: [NSObject : AnyObject]!) {
    }
    //算路回调失败
    func routePlanDidFailedWithError(error: NSError!, andUserInfo userInfo: [NSObject : AnyObject]!) {
    }
    //算路取消回调
    func routePlanDidUserCanceled(userInfo: [NSObject : AnyObject]!) {
    }
    //退出导航
    func onExitNaviUI(extraInfo: [NSObject : AnyObject]!) {
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
350EECB5-07C6-404F-8E1C-0C1795A5D1E0.png

13.运行,是不是没有出错,如果没出错,继续跟上(在看看我们的代码已经变成这样了)


var services =  BNCoreServices.GetInstance()   //InitSDK
let NAVI_APP_KEY = "RbeSg6mnC784wVOfzI6WDtXj"

  //初始化导航SDK
        services.initServices(NAVI_APP_KEY)
        services.startServicesAsyn({ () -> Void in
            print("导航初始化成功")
            }) { () -> Void in
                print("导航初始化失败")
        }

86C84E0A-8C03-4DC3-A033-44D1A2031922.png

import UIKit

class BaiduNavViewController: UIViewController, BNNaviUIManagerDelegate,BNNaviRoutePlanDelegate{
    
    var Begin_longitude:Double=0.0  //初始点X 经度
    var Begin_latitude:Double=0.0   //初始点Y 纬度
    
    var End_longitude:Double=0.0  //终点X 经度
    var End_latitude:Double=0.0   //终点Y 纬度
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        checkServicesInited(Begin_longitude,latitude: Begin_latitude,CurrentaddressX: End_longitude,CurrentaddressY: End_latitude)
        
    }
    
    //检查引擎是否初始化完成
    func checkServicesInited(longitude:Double ,latitude:Double ,CurrentaddressX:Double ,CurrentaddressY:Double){
        services  = BNCoreServices.GetInstance()
        if(!services.isServicesInited()){    //检查引擎是否初始化完成
            print("引擎尚未初始化完成,稍后再试")
        }else{
            startNav(longitude,latitude: latitude,CurrentaddressX: CurrentaddressX,CurrentaddressY: CurrentaddressY)    //启动导航
        }
    }
    func startNav(longitude:Double ,latitude:Double,CurrentaddressX:Double ,CurrentaddressY:Double ){
        let nodesArray:NSMutableArray =  NSMutableArray(capacity: 2)
        //起点 传入的是原始的经纬度坐标,若使用的是百度地图坐标,可以使用BNTools类进行坐标转化
        let startNode:BNRoutePlanNode = BNRoutePlanNode()
        startNode.pos = BNPosition()
        //这里获取到当前的位置的经度纬度就可以了
        startNode.pos.x = longitude//经度
        startNode.pos.y = latitude   //纬度
        startNode.pos.eType = BNCoordinate_BaiduMapSDK
        nodesArray.addObject(startNode)
        //终点
        let  endNode:BNRoutePlanNode = BNRoutePlanNode()
        endNode.pos = BNPosition()
        endNode.pos.x = CurrentaddressX //经度
        endNode.pos.y = CurrentaddressY  //纬度
        endNode.pos.eType = BNCoordinate_BaiduMapSDK
        nodesArray.addObject(endNode)
        let GONav = BNCoreServices.RoutePlanService()
        GONav.startNaviRoutePlan(BNRoutePlanMode_Highway, naviNodes: nodesArray as [AnyObject], time: nil, delegete: self, userInfo: nil   )
    } 
    //算路回调成功
    func routePlanDidFinished(userInfo: [NSObject : AnyObject]!) {
        //路径规划成功,开始导航
        let uiservice =  BNCoreServices.UIService()
        uiservice.showNaviUI(BN_NaviTypeReal, delegete: self, isNeedLandscape: true)
    }
    //算路回调失败
    func routePlanDidFailedWithError(error: NSError!, andUserInfo userInfo: [NSObject : AnyObject]!) {
        if (error.code == 100) {
            print("获取地理位置失败")
        }
        else if (error.code == 102)
        {
            print("定位服务未开启")
        }
    }
    //算路取消回调
    func routePlanDidUserCanceled(userInfo: [NSObject : AnyObject]!) {
        
    }
    //退出导航
    func onExitNaviUI(extraInfo: [NSObject : AnyObject]!) {
        
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

424A21B0-904F-408F-A163-10531CD248F5.png D0D79218-C7BD-4AD5-BEC3-9D1671E6B651.png

14.我们运行...一堆错误 100多个(什么情况坑我呢吧,别急,慢慢来😄)

349B47F5-38EE-4391-AC47-9C04D72F617C.png

15.开始解决我故意留下来最后的错误吧(其实是一开始忘记做那个步骤了...)😄

43BC4AFF-B225-41DE-A5DE-2DD5F72A570B.png

16.编译,是不是没错误了,基本上我们的程序差不多完成了,但是编译完程序崩溃了..(别急还有步骤)


72F6A0E6-5D81-46BD-88F2-A04B2DA59542.png

17.还有个最最关键


CE4226F7-B3CB-4EE7-AD64-BE72D316296F.png
18.好了 运行程序吧,没错误了,那么我们开始来运行导航了
首先先添加一个navigationController 来看看我们Main.storyboard 的界面
2B2B39C4-AAB2-4A3C-B683-136A25E89DC6.png

19.在看看ViewController.swift 代码

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var Begin_longitude: UITextField!
    
    @IBOutlet weak var Begin_latitude: UITextField!
    
    @IBOutlet weak var End_longitude: UITextField!
    
    @IBOutlet weak var End_latitude: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        Begin_longitude.text=113.3684990000.description
        Begin_latitude.text=23.1304880000.description
       
        End_longitude.text=114.0661120000.description
        End_latitude.text=22.5485150000.description
        
    }
    
    @IBAction func goNav(sender: AnyObject) {
        let  baidunav = BaiduNavViewController()
        
          baidunav.Begin_longitude=Double(Begin_longitude.text!)!  //初始点X 经度
         baidunav.Begin_latitude=Double(Begin_latitude.text!)!   //初始点Y 纬度
        
          baidunav.End_longitude=Double(End_longitude.text!)!   //终点X 经度
         baidunav.End_latitude=Double(End_latitude.text!)!  //终点Y 纬度
        

        self.navigationController?.pushViewController(baidunav, animated: true)
    }
    

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
      
    }


}
393E6FCA-5B05-47DD-909C-8605BE4B7310.png

20.好了,我们运行吧 已经完成了 (注:经度纬度可以在http://www.gpsspg.com/maps.htm 里面获取,如果做得灵活点可以通过定位来获取数据),我们来看看我们做出来的成果吧

9F02B24A-9596-4436-A704-C20702250E5E.png

TTS授权是语音功能 如需要请到http://lbsyun.baidu.com/index.php?title=ios-navsdk/guide/voice 申请授权

CB7845D4-D8EF-4413-B24B-87FE5454D274.png 37420455-E72E-4DB2-919B-FCCF65031AA8.png 3E0E3C6D-C566-4357-92D8-992EBDDC8AC4.png

总算写完了...大功告成,如有什么改进,请在留言处留言。

上一篇下一篇

猜你喜欢

热点阅读