ISO Swift高德导航开发指南

开发环境

xode:12.0
模拟器:iphone 14 plus
cocoapods:1.15.2
swift:5.7.1
ios:16.1(20B72)

IOS包管理工具cocoapods

官网地址:https://cocoapods.org/

方式1:安装指令

sudo gem install cocoapods

方式2:直接下载安装包安装
安装包下载地址:https://cocoapods.org/app

进入应用目录,并初始化cocoapods

cd ~/Desktop/Workspaces/MapKitDemo
pod init;
vim Podfile

添加依赖
http请求工具:Alamofire
JOSN转换工具:SwiftyJSON
JSON转对象插件:HandyJSON
高德导航依赖:AMapNaviAMapSearch

  pod "AMapNavi" , "10.0.600"
  pod "AMapSearch" , "9.7.0"
  pod "SwiftyJSON" , "5.0.2"
  pod "HandyJSON" , "5.0.2"
  pod "Alamofire" , "~> 5.2"

执行安装依赖命令

pod install

后续增加依赖可修改Podfile文件,增加pod配置,再执行pod install命令

打开应用

安装cocoapods的应用,不能直接打开.xcodeproj文件,需要打开生成的.xcworkspace文件

open MapKitDemo.xcworkspace/

申请高德开放平台Key

https://lbs.amap.com/api/ios-navi-sdk/guide/create-project/get-key

AMapServices.shared().apiKey = ""

隐私合规说明
在调用任何一个导航manager之前必须进行合规检查,设置接口之前保证隐私政策合规,检查接口如下:

AMapNaviManagerConfig.shared().updatePrivacyShow(.didShow, privacyInfo: .didContain)
AMapNaviManagerConfig.shared().updatePrivacyAgree(.didAgree)

权限配置

修改info.plist配置文件,添加非https网络请求服务、定位服务、语音播报服务、后台定位服务

	<key>NSAppTransportSecurity</key>
	<dict>
		<key>NSAllowsArbitraryLoads</key>
		<true/>
	</dict>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>导航SDK需要您的定位服务,否则可能无法使用,如果您需要使用后台导航功能请选择“始终允许”。</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>导航SDK需要您的定位服务,否则可能无法使用。</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>导航SDK需要您的定位服务,否则可能无法使用。</string>
<key>UIBackgroundModes</key>
<array>
	<string>audio</string>
	<string>location</string>
</array>

开启定位服务

import UIKit
import CoreLocation

class ViewController: UIViewController,CLLocationManagerDelegate {
   
    let locationManage = CLLocationManager()
   
    override func viewDidLoad() {
        super.viewDidLoad()
        locationManage.delegate=self
        locationManage.desiredAccuracy = kCLLocationAccuracyBest//设置位置精度
        locationManage.requestLocation()//请求用户位置,仅一次
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        locationManage.requestWhenInUseAuthorization()//请求授权获取定位
        
    }
    
    //请求位置时自动调用
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let latitude=locations[0].coordinate.latitude
        let longitude=locations[0].coordinate.longitude
        print(latitude,longitude)
    }
    
    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print("获取定位失败",error)
    }
   
}

初始化 AMapNaviCompositeManager

import UIKit
import AMapNaviKit
import AMapFoundationKit

class MapNavController:UIViewController,AMapNaviCompositeManagerDelegate{
    override func viewDidLoad() {
        super.viewDidLoad()

        initNavi()
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        //在显示地图前需要进行隐私合规设置
        AMapNaviManagerConfig.shared().updatePrivacyShow(.didShow, privacyInfo: .didContain)
        AMapNaviManagerConfig.shared().updatePrivacyAgree(.didAgree)

    }

	//初始化导航
	func initNavi(){
	    
	    self.view.backgroundColor = UIColor.white;
	    
	    //创建进入导航的按钮
	    let routeBtn = UIButton(configuration: UIButton.Configuration.tinted(), primaryAction: nil)
	    routeBtn.frame = CGRect.init(x: (UIScreen.main.bounds.size.width - 200) / 2.0, y: 200.0, width: 200.0, height: 45.0)
	    routeBtn.setTitle("打开导航", for: UIControl.State.normal)
	    routeBtn.setTitleColor(UIColor.init(red: 53/255.0, green: 117/255.0, blue: 255/255.0, alpha: 1), for: UIControl.State.normal)
	    routeBtn.layer.cornerRadius = 5
	    routeBtn.layer.borderColor = UIColor.init(red: 53/255.0, green: 117/255.0, blue: 255/255.0, alpha: 1).cgColor
	    routeBtn.layer.borderWidth = 1
	    routeBtn.addTarget(self, action: #selector(self.openNavPage),for: UIControl.Event.touchUpInside)
	    self.view.addSubview(routeBtn)
	    
	    //初始化导航组件
	    self.compositeManager = AMapNaviCompositeManager.init()
	    self.compositeManager.delegate = self
	}

    //打开导航页面
    @objc func openNavPage() {
        let config = AMapNaviCompositeUserConfig.init()
        
        let info = AMapNaviVehicleInfo.init()
       //设置车辆类型, 0:燃油客车; 1:燃油货车; 2:纯电动客车; 3:纯电动货车; 4:插电式混动客车; 5:插电式混动货车; since 8.0.0 新增11:摩托车. 默认0(小车). 注意:只有设置了货车, 其他关于货车的属性设置才会生效
        info.type = 0;
        config.setVehicleInfo(info);
        info.vehicleId = "浙F-12345";
        let startLat:Double = 39.902896
        let startLon:Double = 116.42792
        let startCity:String ="北京站"
        config.setRoutePlanPOIType(AMapNaviRoutePlanPOIType.start, location: AMapNaviPoint.location(withLatitude: startLat, longitude: startLon), name: startCity, poiId: nil)
            //最多3个途径点
        let lat:Double= 39.975642
        let lon:Double= 116.306332
        let city:String = "苏州街(地铁站)"
        config.setRoutePlanPOIType(AMapNaviRoutePlanPOIType.way, location: AMapNaviPoint.location(withLatitude: lat, longitude: lon), name: city, poiId: nil)
            
       let endLat:Double = 39.894914
       let endLon:Double = 116.322062
       let endCity:String = "北京西站"
       config.setRoutePlanPOIType(AMapNaviRoutePlanPOIType.end, location: AMapNaviPoint.location(withLatitude: endLat, longitude: endLon), name: endCity, poiId: nil)
        //通过parsent方式显示路线规划页面
        self.compositeManager.presentRoutePlanViewController(withOptions: config)
    }

    // MARK: - AMapNaviCompositeManagerDelegate
    /**
     * @brief 发生错误时,会调用此方法
     * @param compositeManager 导航组件类
     * @param error 错误信息
     */
    func compositeManager(_ compositeManager: AMapNaviCompositeManager, error: Error) {
        let error = error as NSError
        NSLog("导航异常:{%d - %@}", error.code, error.localizedDescription)
    }
    /**
     * @brief 算路成功后的回调函数, 路径规划页面的算路、导航页面的重算等成功后均会调用此方法
     * @param compositeManager 导航组件类
     */
    func compositeManager(onCalculateRouteSuccess compositeManager: AMapNaviCompositeManager ){
        NSLog("导航算路成功,%ld", compositeManager.naviRouteID)
    }

    /**
     * @brief 开始导航的回调函数
     * @param compositeManager 导航组件类
     * @param naviMode 导航类型,参考 AMapNaviMode .
     */
    func compositeManager(_ compositeManager: AMapNaviCompositeManager, didStartNavi naviMode: AMapNaviMode) {
        NSLog("开始导航")
    }
    
    
    /**
     * @brief 导航到达目的地后的回调函数
     * @param compositeManager 导航组件类
     * @param naviMode 导航类型,参考 AMapNaviMode .
     */
    func compositeManager(_ compositeManager:AMapNaviCompositeManager , didArrivedDestination naviMode :AMapNaviMode){
        NSLog("导航到达目")
    }

    /**
     * @brief 导航组件页面回退或者退出导航组件时会调用此函数 since 5.5.0
     * @param compositeManager 导航组件类
     * @param backwardActionType 导航组件页面回退的动作类型,参考 AMapNaviCompositeVCBackwardActionType .
     */
    func compositeManager(_ compositeManager:AMapNaviCompositeManager ,didBackwardAction backwardActionType:AMapNaviCompositeVCBackwardActionType){
        NSLog("导航组件页面回退或者退出导航")
    }

    /**
     * @brief 每次进入导航组件时和驾车路径规划策略改变均会调用此方法 since 6.1.0
     * @param compositeManager 导航组件类
     * @param driveStrategy 驾车路径规划策略,参考 AMapNaviDrivingStrategy .
     */
    func compositeManager(_ compositeManager:AMapNaviCompositeManager ,onDriveStrategyChanged driveStrategy:AMapNaviDrivingStrategy){
        NSLog("进入导航")
    }

    /**
     * @brief 导航到达某个途经点的回调函数 since 6.1.0
     * @param compositeManager 导航组件类
     * @param wayPointIndex 到达途径点的编号,标号从0开始. 注意:如果导航过程进行了路径重算(包含偏航、手动刷新等),wayPointIndex会重新从0开始计数
     */
    func compositeManager(_ compositeManager:AMapNaviCompositeManager ,onArrivedWayPoint wayPointIndex:Int){
        NSLog("导航到达某个途经点")
    }
}

开启弹出导航页面窗口配置

修改AppDelegate文件,增加UIWindow配置

import AMapFoundationKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        let viewController = ViewController()
        window = UIWindow(frame: UIScreen.main.bounds);
        window!.rootViewController = UINavigationController(rootViewController: viewController)
        window!.backgroundColor = UIColor.white
        window!.makeKeyAndVisible()
        
        AMapServices.shared().apiKey = "" //高德KEY
        //高德 iOS SDK 支持苹果 ATS 安全功能的方案,为保证应用在提交 AppStore 时不受影响,需要开启 HTTPS 功能
        AMapServices.shared().enableHTTPS = true
        return true
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/554895.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LIUNX文件系统

目录 1.磁盘的物理结构 2.CHS定位法 3.磁盘的逻辑存储 4.系统层面 inode.block[15] 创建文件的流程 查找文件的流程 了解文件系统&#xff0c;首先要了解磁盘是如何存储和读取数据的。 1.磁盘的物理结构 可以理解这个盘上有很多的小磁铁&#xff0c;通过旋转盘面和摆动…

C# 整数转罗马数字

罗马数字包含以下七种字符:I&#xff0c;V&#xff0c;X&#xff0c;L&#xff0c;C,D和M。 例如&#xff0c;罗马数字2写做 II &#xff0c;即为两个并列的 1。12 写做XII&#xff0c;即为XII。27写做 XXVII,即为XXV II 。 通常情况下&#xff0c;罗马数字中小的数字在大的数字…

显示msvcp140.dll丢失要如何解决?这5种方法高效修复msvcp140.dll

msvcp140.dll是Microsoft Visual C Redistributable软件包中的一个文件&#xff0c;主要用于支持使用C编程语言编写的软件的正常运行。如果你的电脑出现缺少msvcp140.dll的错误消息&#xff0c;可能会影响到某些程序的启动和运行。然而&#xff0c;不必过度担心&#xff0c;因为…

【SQL每日一练】分组过滤练习题

文章目录 前言MySQL语法注意&#xff1a; 前言 题目&#xff1a;现在运营想查看每个学校用户的平均发贴和回帖情况&#xff0c;寻找低活跃度学校进行重点运营&#xff0c;请取出平均发贴数低于5的学校或平均回帖数小于20的学校。 drop table if exists user_profile; CREATE …

JavaSE:继承 多态

继承 继承的本质 子类能够使用父类的方法和变量 使用场景&#xff1a;代码复用 在一个类中实现了一个很复杂的方法&#xff0c;给一个新类重新实现这个方法&#xff0c;我们直接继承即可 public class Student {public String sno;public void study() {System.out.printl…

2024妈妈杯数学建模思路A题思路汇总分析 MathorCup建模思路分享

C题&#xff1a;移动通信网络中PCI规划问题 &#xff08;完整版内容放在文末了&#xff09; 2024MathorCup A题完整思路完整数据可执行代码后续高质量成品论文 l 难度评分: 3.5/5 l 开放度评分: 3/5 l 适合专业: 通信工程、计算机科学、电子工程 l 主要算法: 图论算法、…

02 - Git 之命令 + 删除 + 版本控制 + 分支 + 标签 + 忽略文件 + 版本号

1 Git相关概念 1.1 以下所谈三个区&#xff0c;文件并不只是简单地在三个区转移&#xff0c;而是以复制副本的方式转移 使用 Git 管理的项目&#xff0c;拥有三个区域&#xff0c;分别是 Working area工作区&#xff08;亦称为 工作树Working Tree&#xff09;、stage area …

vscode按ctrl+鼠标左键没反应

vscode按ctrl鼠标左键没反应 问题问题解决 问题 新买的阿里云服务器,在连接vscode后,按ctrl鼠标左键没反应,怎么办? 问题解决 你没有在vscode上安装c的相关插件,安装之后才可以实现按ctrl鼠标左键跳转到函数的定义

书生·浦语大模型第二期实战营(4)笔记

Finetune 为什么要微调 适应下游任务 两种微调范式 上面的是增量训练 下面的是指令微调 数据格式 微调方案 lora&#xff1a; 在基座模型的基础上再套用一个小模型 XTuner 简介 快速上手 LnternLM2 1.8B 多模态LLM

springdoc-openapi使用

springdoc-openapi使用 一、引入pom二、新增配置类OpenApiConfig四、Controller层示例五、配置文件新增内容六、验证 一、引入pom <dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-ui</artifactId><version>1…

IT如何与业务双向奔赴,高效并驱共“盈”企业发展

随着经济和技术的飞速发展&#xff0c;在当前数字化时代中&#xff0c;如何进行有效的数字化转型、运用新技术&#xff0c;特别是让AI技术融入企业的具体业务场景、快速实现应用场景的落地、确保企业不落后于时代发展&#xff0c;是每一位CIO都会面临的一项挑战。 IT部门在企业…

Centos7.9 脚本一键部署nextcloud,配置Nginx代理Https。

目录 一键安装nextcloud 出现错误TypeError Cannot read properties of undefined (reading ‘writeText‘) 生成自签名SSL证书 编辑Nginx配置文件 启动Nginx 一键安装nextcloud 本脚本参考文章&#xff0c;本文较长建议先看完在操作&#xff01;&#xff01;&#xff01;…

基于数据库现有表导出为设计文档

1.查询 SELECTCOLUMN_NAME 字段名,COLUMN_COMMENT 字段描述,COLUMN_TYPE 字段类型,false as 是否为主键 FROMINFORMATION_SCHEMA.COLUMNS wheretable_NAME region -- 表名2.查询结果 3.导出为excel

考研OSchap1计算机系统概述

目录 一、概念 p1 二、功能 p3 1.作为计算机资源的管理者 &#xff08;1&#xff09;文件管理 &#xff08;2&#xff09;存储器管理 &#xff08;3&#xff09;处理机管理 &#xff08;4&#xff09;设备管理 2.作为用户与计算机硬件系统之间的接口 &#xff08;1&…

VMware与新插入的虚拟机 版本不兼容解决方法

1、找到虚拟机目录文件 2、用记事本打开修改版本号&#xff08;找到虚拟机版本号&#xff09; 3、如图所示为版本15的型号 4、修改virtualHW.version "15"&#xff08;引号里面对应上面版本号&#xff09; 5、修改成功

UKP3d,AutoPDMS设置埋地数据导出至AutoPSA的查看方法

一用户在设置了埋地数据&#xff0c;导出至AutoPSA未有数据。具体操作方法如下&#xff1a; AutoPSA里提供两种埋地计算&#xff0c;一是仿start计算&#xff1b;二是仿CII计算 1.AutoPSA10.0仿start计算新埋地模块的操作方法&#xff1a; AutoPSA10.0新埋地模块需要用户根据实…

无线通信基本原理笔记

通信&#xff1a;人与人或人与自然之间通过某种行为或媒介进行的信息交流与传递。 通信模型&#xff1a;信源→发送设备→信道&#xff08;↑噪声&#xff09;→接收设备→信宿 调制&#xff1a;把基带信号变换成适合在信道中传输的信号的技术。通过改变高频载波的幅度、相位…

腾讯一面:你了解js的沙箱环境吗?

去年的面试了&#xff0c;最近复盘了一下&#xff0c;发现菜的一批&#xff0c;有些问题一下子就答出来了&#xff0c;现在答的话&#xff0c;那时候还在瞎鸡儿答我也不知道答的什么。。。。 在 JavaScript 中&#xff0c;沙箱&#xff08;sandbox&#xff09;是一个安全机制&…

【python】Paste Mask

学习来自【OpenCv】利用roi 掩模 将一张图片添加到另一张上 任务描述&#xff1a;提取图片A的 mask 区域&#xff0c;并粘贴到图片B上 文章目录 1 代码实现2 结果展示3 涉及到的库cv2.bitwise_notcv2.bitwise_andcv2.add 附录——获取 mask 的边界框 1 代码实现 A 图 A 图的 …

linux中/etc/hosts文件的内容和功能

更准确的说是主机和ip地址映射绑定配置文件 用于主机名解析成ip地址的 转换配置 效果&#xff1a; 这个东西是局域网下面的解析&#xff0c;老师说是本地局域网解析 windows对应的就是
最新文章