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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容