iOS接入高德地图填坑史

1 接入

前提

  • 工程是在uniapp的基础上再接入高德地图导航SDK。由于uniapp自带了定位和地图SDK(同时包括高德地图和百度地图)但是不带导航SDK,导致接入导航SDK时出现了各种问题。

  • 为什么接入高德地图
    根据unipp官方文档可知,目前只有高德地图支持nvue(百度地图暂时不支持),而工程目前是以uniapp为基础且地图用到了nvue组件,所以暂时只能接入高德地图,并需要导入nvue对应的原生SDK。

高德地图接入

自动部署

  • 通过Pod方式自动部署。
    这个方式比较方便,且后期对SDK进行迭代升级时也比较简单,只需要修改Podfile对应的版本号即可。

  • 在接入高德地图的时候,着实被坑了一把:通过高德地图官网找到目前最新的导航SDK版本为9.3.0,真机调试没有问题,但是通过Archive打包却失败了。通过各种报错信息查找资料的时候,鬼使神差地跳到了高德地图官网的更新日志,赫然发现:\color{#FF0000}{高德地图自V9.3.0版本开始,不再支持armv7架构}。去掉即可(具体操作见下面“2 遇到的问题以及处理”)。

手动部署

  • 下载高德导航SDK再导入到工程中。

  • 由于uniapp离线工程本身包含有定位和地图SDK,包括高德地图SDK(比如AMapFoundationKit.framework、AMapLocationKit.framework、AMapSearchKit.framework以及MAMapKit.framework),但是不包含导航SDK(AMapNaviKit.framework),所以需要额外导入。但是高德地图对各个库进行了版本控制,所以在导入SDK时需要检查SDK的版本。

  • 目前该问题未解决。

2 遇到的问题以及处理

执行pod install报错

(1)配置了Podfile,但是没有生效

  • 原因:Podfile是手写的,重新核查发现有个pod写成Pod。修改后,可以正常执行命令pod install
    然后:关掉该xode工程,会自动生成xcworkspace文件,点开就进入了工作空间(原因是Pods文件夹已经自动生成了)。

(2)pod install:无效

zsh: command not found: pod
  • 处理:
    通过ruby安装cocoapod:
sudo gem install cocoapods -v 1.8.3

(3)pod install报错
最开始Podfile引入库时未指定版本号。

Installing AMap3DMap (7.2.0)
Installing AMapFoundation (1.7.0)
Installing AMapLocation (2.9.0)
Installing AMapSearch (7.1.0)
  • 原因:应该是SDK版本太低。

  • 处理:修改SDK对应的版本号(如下)。由于导航SDK包含基础库,所以基础库可以不引入。

#    pod 'AMap3DMap', '9.3.1' #3D地图SDK
    pod 'AMapSearch', '9.3.1' #地图SDK搜索功能
#    pod 'AMapLocation', '2.9.0' #定位SDK
    pod 'AMapNavi', '9.3.0'  #导航 SDK

鉴权问题

2022-07-15 11:47:04.981221+0800 app-demo-ios[4828:1921600] sy.app: Error: Error Domain=AMapSearchErrorDomain Code=1008 "INVALID_USER_SCODE" UserInfo={NSLocalizedDescription=INVALID_USER_SCODE} - 错误信息:安全码验证错误,bundleID与key不对应。请在<AMapSearchKit/AMapSearchError.h>头文件中查看错误信息或者访问【http://lbs.amap.com/api/ios-sdk/guide/map-tool/errorcode/】了解详细信息。

  • 处理:配置从高德地图申请的APIKey即可。

工程签名报错

officialDemoNavi has conflicting provisioning settings.

officialDemoNavi is automatically signed, but provisioning profile 3f3a460b-b68c-4868-83fb-84c49237ee75 has been manually specified. Set the provisioning profile value to "Automatic" in the build settings editor, or switch to manual signing in the Signing & Capabilities editor.
  • 原因:这是高德地图官方导航SDK工程,下载下来时签名已有配置。

  • 处理:在project.pbxproj文件中删除如下语句:
    PROVISIONING_PROFILE = "3f3a460b-b68c-4868-83fb-84c49237ee75";

引入库冲突

'MAMapView' has different definitions in different modules; first difference is definition in module 'AMapNaviKit.MAMapView' found property
  • 排查:应该是3D和Nav两个库有冲突

  • 原因:pch文件中有做高德地图库的导入,然后文件中又有相关库导入,导致库冲突了。
    把pch文件中的导入注释掉即可。

经纬度浮点数不匹配

  • 前端传递的经纬度如下:
{
    latitude = "32.23333";
    longitude = "123.3333";
}

iOS显示,类型为float:

lat:32.23332977294922, lon:123.3332977294922
  • 排查:将第二个longitude设置为double类型,正常了。奇怪!
lat:32.23332977294922, lon:123.3333
  • 处理:前端时通过JSON格式传递过来的时,其中的数值iOS接收后转为NSNumber,需要设置为double类型。

隐私权限弹窗

2022-08-03 10:19:57.233366+0800 app-demo-ios[510:31510] [AMapNaviKit]:Error Domain=AMapFoundationErrorPrivacyShowUnknow Code=555570 "(null)" UserInfo={info=使用AMapNaviKit SDK 功能前请设置隐私权政策是否弹窗告知用户}

  • 处理:前面整理工程的时候,把如下隐私弹窗的代码注释掉了,调试的时候卸载了APP,重新安装就没有执行如下步骤,导致高德地图设置车辆信息失败并导致算路和导航无效:
        //更新App是否显示隐私弹窗的状态,隐私弹窗是否包含高德SDK隐私协议内容的状态. since 8.1.0
        [MAMapView updatePrivacyShow:AMapPrivacyShowStatusDidShow privacyInfo:AMapPrivacyInfoStatusDidContain];

-参考:
https://blog.csdn.net/m0_55124878/article/details/121840608
https://www.jianshu.com/p/e94a0e29b88e

路径规划:API

'getNaviGuideList' is deprecated: 已废弃,请使用 AMapNaviRoute 中的 guideGroups 替代  since 7.5.0

Archive打包失败

  • 问题:真机调试没有问题,但是通过Archive打包却失败
ld: warning: Could not find or use auto-linked framework 'AMapNaviKit'
Undefined symbols for architecture armv7:
  "_OBJC_METACLASS_$_MAPointAnnotation", referenced from:
      _OBJC_METACLASS_$_NaviPointAnnotation in NaviPointAnnotation.o
  "_OBJC_CLASS_$_AMapNaviDriveView", referenced from:
      objc-class-ref in DriveNaviViewController.o
      objc-class-ref in GPSTruckNaviViewController.o
      objc-class-ref in GPSNaviViewController.o
  "_OBJC_METACLASS_$_MABaseOverlay", referenced from:
      _OBJC_METACLASS_$_SelectableOverlay in SelectableOverlay.o
  "_OBJC_CLASS_$_MAAnnotationView", referenced from:
      objc-class-ref in TruckOrderHeatMapViewController.o
  "_OBJC_CLASS_$_AMapNaviVehicleInfo", referenced from:
      objc-class-ref in AMapNaviVehicleInfo+Get.o
      __OBJC_$_CATEGORY_AMapNaviVehicleInfo_$_Get in AMapNaviVehicleInfo+Get.o
      objc-class-ref in GPSTruckNaviViewController.o
      objc-class-ref in TruckRoutePlanViewController.o
  "_OBJC_CLASS_$_AMapNaviPoint", referenced from:
      objc-class-ref in TruckOrderHeatMapViewController.o
      objc-class-ref in GPSTruckNaviInfo.o
      objc-class-ref in GPSNaviViewController.o
      objc-class-ref in TruckRoutePlanViewController.o
  "_OBJC_CLASS_$_MABaseOverlay", referenced from:
      _OBJC_CLASS_$_SelectableOverlay in SelectableOverlay.o
  "_OBJC_CLASS_$_MATileOverlay", referenced from:
      objc-class-ref in TruckOrderHeatMapViewController.o
  "_OBJC_CLASS_$_MAPointAnnotation", referenced from:
      objc-class-ref in TruckOrderHeatMapViewController.o
      _OBJC_CLASS_$_NaviPointAnnotation in NaviPointAnnotation.o
  "_OBJC_CLASS_$_MAHeatMapNode", referenced from:
      objc-class-ref in TruckOrderHeatMapData.o
  "_OBJC_CLASS_$_MATileOverlayRenderer", referenced from:
      objc-class-ref in TruckOrderHeatMapViewController.o
  "_OBJC_CLASS_$_MAMapView", referenced from:
      objc-class-ref in TruckOrderHeatMapViewController.o
      objc-class-ref in AppDelegate.o
  "_OBJC_CLASS_$_MAHeatMapTileOverlay", referenced from:
      objc-class-ref in TruckOrderHeatMapViewController.o
  "_OBJC_CLASS_$_MAUserLocation", referenced from:
      objc-class-ref in TruckOrderHeatMapViewController.o
  "_OBJC_CLASS_$_AMapNaviDriveManager", referenced from:
      objc-class-ref in TruckOrderHeatMapViewController.o
      objc-class-ref in GPSTruckNaviViewController.o
      objc-class-ref in GPSNaviViewController.o
      objc-class-ref in TruckRoutePlanViewController.o
  "_OBJC_CLASS_$_MAHeatMapGradient", referenced from:
      objc-class-ref in TruckOrderHeatMapViewController.o
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)
  • \color{#FF0000}{关键信息}:通过搜素(ld: symbol(s) not found for architecture armv7)找到如下参考(https://www.jianshu.com/p/4f9ae7883643)。这个时候才意识到需要先检查一下AMapNaviKit支持的架构,并检查Xcode工程对于架构支持的配置。

  • 处理:执行命令

lipo -info -XXX

发现\color{#FF0000}{AMapNaviKit}确实只支持x86_64 arm64,但是\color{#FF0000}{不支持armv7}.

hh@hhdeMacBook-Pro ~ % lipo -info /Users/hh/Documents/function/AMap_iOS_Navi_ALL/AMap_iOS_Navi_ALL/officialDemoNavi/Frameworks/AMapNaviKit.framework/AMapNaviKit 
Architectures in the fat file: /Users/hh/Documents/function/AMap_iOS_Navi_ALL/AMap_iOS_Navi_ALL/officialDemoNavi/Frameworks/AMapNaviKit.framework/AMapNaviKit are: x86_64 arm64 

hh@hhdeMacBook-Pro ~ % lipo -info /Users/hh/Documents/function/AMap_iOS_Navi_ALL/AMap_iOS_Navi_ALL/officialDemoNavi/Frameworks/AMapFoundationKit.framework/AMapFoundationKit
Architectures in the fat file: /Users/hh/Documents/function/AMap_iOS_Navi_ALL/AMap_iOS_Navi_ALL/officialDemoNavi/Frameworks/AMapFoundationKit.framework/AMapFoundationKit are: armv7 x86_64 arm64 

hh@hhdeMacBook-Pro ~ % lipo -info /Users/hh/Documents/function/AMap_iOS_Navi_ALL/AMap_iOS_Navi_ALL/officialDemoNavi/Frameworks/AMapSearchKit.framework/AMapSearchKit
Architectures in the fat file: /Users/hh/Documents/function/AMap_iOS_Navi_ALL/AMap_iOS_Navi_ALL/officialDemoNavi/Frameworks/AMapSearchKit.framework/AMapSearchKit are: armv7 x86_64 arm64 
image.png
  • 处理:由于uniapp离线工程是默认配置的,找到Build Settings--User-Defined,修改VALID_ARCHS,去掉armv7即可。
image.png

支持armv7的iPhone有哪些:

  • armv7 设备: iPhone3GS, iPhone4, iPhone4S iPad, iPad2, iPad3(The New iPad), iPad mini iPod Touch 3G, iPod Touch4

  • 说明:这样看,去掉armv7架构支持影响不大。
    iPad选项也支持arm64的,所以暂时先保留。

  • 参考:
    https://article.itxueyuan.com/BnxQ7

真机调试成功和Archive打包失败原因

  • 真机调试,设备支持是iOS Devices,是以具体的手机设备对应的系统版本以及架构支持为基准的,比如iPhone12(arm64架构),所以运行没有问题。

  • Archive打包,设备支持是Any iOS Device(arm64, armv7),所以就会打包失败。

3 手动部署:遇到的问题

手动部署

  • 在上面自动部署未找到解决方案之前,尝试了进行手动部署。没想到更坑!

(1)根据uniapp官方离线文档导入高德地图SDK:编译报错

Showing Recent Messages
/Users/hh/Documents/ios-pro/iOSSDK-3.4.15/app-demo-ios/Pods/Pods.xcodeproj The iOS deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 7.0, but the range of supported deployment target versions is 9.0 to 15.5.99.

That command depends on command in Target '/app-demo-ios' (project '/app-demo-ios'): script phase “[CP] Copy Pods Resources”
  • 原因:在项目PROJECT下找到Deployment--iOS Deployment Target
    可以看到设置为6.0,这太低了,而且和TARGETS下的Deployment--iOS Deployment Target(设置为9.0)不匹配。改成一致即可(9.0)。

(2)资源重复引入问题

Multiple commands produce '/Users/hh/Library/Developer/Xcode/DerivedData/app-demo-ios-bqoygcrtkhrstcchfqexahmzlfhh/Build/Intermediates.noindex/ArchiveIntermediatesapp-demo-ios/InstallationBuildProductsLocation/Applications/app-demo-ios.app/AMap.bundle'

Target 'app-demo-ios' (project 'app-demo-ios') has copy command from '/Users/hh/Documents/ios-pro/iOSSDK-3.4.15/app-demo-ios/AMap.bundle' to '/Users/hh/Library/Developer/Xcode/DerivedData/app-demo-ios-bqoygcrtkhrstcchfqexahmzlfhh/Build/Intermediates.noindex/ArchiveIntermediates/app-demo-ios/InstallationBuildProductsLocation/Applications/app-demo-ios.app/AMap.bundle'

That command depends on command in Target 'app-demo-ios' (project 'app-demo-ios'): script phase “[CP] Copy Pods Resources”

  • 原因:由于额外导入了AMapNavi库,这个库内自引入了Amap.bundle资源文件。而根据uniapp官方离线文档介绍,需要引入Amap.bundle资源文件(因为uniapp的定位和地图功能不需要导入AMapNavi库),导致资源文件重复引入了。在Build Phases里的Copy Bundle Resources里去掉AMap.bundle资源文件即可。

导航SDK引入问题

  • 导入AMapNavi.framework库
    (1)首先是重复引入库错误:
duplicate symbol '_utils_convert_writeShort' in:
    /Users/hh/Documents/ios-pro/iOSSDK-3.4.15/SDK/Libs/MAMapKit.framework/MAMapKit(MAMapKit-arm64-master.o)
    /Users/hh/Documents/ios-pro/iOSSDK-3.4.15/app-demo-ios/Frameworks/AMapNaviKit.framework/AMapNaviKit(AMapNaviKit-arm64-master.o)
duplicate symbol '_xxteakey' in:
    /Users/hh/Documents/ios-pro/iOSSDK-3.4.15/SDK/Libs/MAMapKit.framework/MAMapKit(MAMapKit-arm64-master.o)
    /Users/hh/Documents/ios-pro/iOSSDK-3.4.15/app-demo-ios/Frameworks/AMapNaviKit.framework/AMapNaviKit(AMapNaviKit-arm64-master.o)
ld: 848 duplicate symbols for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

(2)编译成功,运行崩溃:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[AMapServices checkPrivacyStatus:component:]: unrecognized selector sent to instance 0x281508e10'
terminating with uncaught exception of type NSException
  • 处理:AppDelegate添加相应的高德地图代码后,编译报错:
/Users/hh/Documents/ios-pro/iOSSDK-3.4.15/app-demo-ios/Frameworks/AMapNavikit.framework/Headers/MAMapVersion.h:20:2: "The AMapFoundationKit version is less than minimum required, please update! Any questions please to visit http://lbs.amap.com"

处理:难!

手动部署:总结

  • 考虑到uniapp自引入的高德地图SDK和额外引入的AMapNavi.framework库版本可能不统一,这边做了统一版本的尝试,包括统一使用官网下载的SDK版本,以及统一使用之前Pods文件夹下的版本。但仍然报错(The AMapFoundationKit version is less than minimum required, please update!)。后续这边又切回到Pod方式并找到了解决方案,所以这边就没再尝试了。

  • 目前该问题未解决。

4 其他

腾讯地图

经纬度查询 - 坐标拾取系统

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

推荐阅读更多精彩内容