小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
通过问题看本质!!!
CocoaPod库引入高德地图遇到的一些坑点
1、在制作高德地图的pod库时,找不到框架:
pod中不包含任何类文件的时候,即podspec中设置了s.source_files,在工程中pod install后可以直接#import <MAMapKit/MAMapKit.h>等框架;但是单pod中包含其他类文件时,在工程中pod install后直接#import <MAMapKit/MAMapKit.h>等框架会报找不到('MAMapKit/MAMapKit.h' file not found)。
通过比较发现,是Framework Search Paths 路径不对。前者的路劲是"${PODS_ROOT}/../../MyRepo/Classes/AMap_iOS_Lib",后者的路劲是"${PODS_CONFIGURATION_BUILD_DIR}/MyRepo"。
解决办法:把后者改为"${PODS_ROOT}/../../MyRepo/Classes/AMap_iOS_Lib"就可以正常#import了。因此,可以探索如何通过pod自动配置为"${PODS_ROOT}/../../MyRepo/Classes/AMap_iOS_Lib"。
后期使用,遇到了问题2,又坑了一把.
2、工程中能引用但不能调用
制作pod库依赖自己制作的高德地图.a静态库或依赖微信.a静态库时,podspec文件里没有把高德地图需要的系统库和他本身的Framework都引用,在该pod或工程里可以import,却不可使用,报错:
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_AMapLocationManager", referenced from:
objc-class-ref in CLTMapViewController.o
ld: symbol(s) not found for architecture x86_64
原因:在制作的高德微信pod库中,s.source_files中如果没有使用相关类,在依赖者或工程中都是无法使用的会报:
Undefined symbols for architecture x86_64/armv7/...:
"_OBJC_CLASS_$_MAMapView", referenced from:
objc-class-ref in CLTViewController.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
解决方法:可以将功能实现封装在pod中,例如微信支付、分享等。有个奇怪的问题是,在pod内用到的类,在工程中使用就不会报以上错误。
3、部分高德地图分模块无法引用
使用直接依赖高德pod库,封装好自己的高德pod库,在swift的pod库中无法使用,import AMapLocationKit提示No such module ‘AMapLocationKit’,还有’AMap2DMap’。提示是缺少module,因此建议高德地图组件单独OC封装或混编封装。
4、高德地图提示apiKey没有注册
在Appdelegate里注册了高德地图的apiKey依然提示没有注册
[AMapServices sharedServices].apiKey = @"your apiKey";
[AMapFoundationKit][Info] : 错误信息:apiKey为空,请正确设置AMapServices.apiKey。请在 AppDelegate.m 文件的 didFinishLaunchingWithOptions 方法中配置高德 Key。
将注册代码放到封装的pod里执行即可。我这里是有个配置文件config:
//Swift代码
TMHConfig.config(withUrl: "url",
uid: uid,
token: "tiket",
appName: "name",
gd_apiKey: "your apiKey")
配置文件建议放到使用这个库的时候在配置。