目前项目工作中用到了百度地图sdk,遇到了不少问题,在此记录一下,顺便吐槽下希望百度能把这地图sdk做的更好用一点。
1,开发环境,
Xcode6.0 (6A313) + 百度地图 iOS SDK v2.6.0,我的问题都是在这个环境下遇到的,如果环境不一样,解决方法未经验证,不一定管用。
2,准备工作
1)申请密钥(key);申请应用key,这里申请的 应用名称 和 key都需要保存,开发时会用到。百度有教程:(http://developer.baidu.com/map/index.php?title=iossdk/guide/key)
2)下载sdk,将a文件合;百度地图sdk 提供了供模拟器和真机用的两个a文件,可以用lipo -create Release-iphoneos/libbaidumapapi.a Release-iphonesimulator/libbaidumapapi.a -output libbaidumapapi.a 命令将其合并为一个
百度教程:(http://developer.baidu.com/map/index.php?title=iossdk/guide/hellobaidumap)
3)添加依赖文件;添加依赖库CoreLocation.framework和QuartzCore.framework、 OpenGLES.framework、SystemConfiguration.framework、CoreGraphics.framework、 Security.framework。
4)将合并好的a文件,连同mapapi.bundle 和头文件一起加入工程中
注意事项:参考百度教程:(http://developer.baidu.com/map/index.php?title=iossdk/guide/attention)
准备工作到此完成,简单的使用不再介绍,参考百度的教程就行(http://developer.baidu.com/map/index.php?title=iossdk/guide/hellobaidumap)
3,遇到的问题及解决:
1)BMKMapManager start failed
[self.mapManager start:@"xxxxxxxxx" generalDelegate:nil]; 需要设置 Bundle display name 为注册时的应用名,且应用名要和key对应,否则会失败
Xcode6 中新建的工程中没有 Bundle display name 这个属性,需要自己添加, 在supporting Files-info.plist 中新加这一属性(这个属性名下拉菜单里有),将其值设置为在百度上注册的应用名,应用名与key必须对应,否则就会初始化失败
2)Unknown class BMKMapView in Interface Builder file
如果只在xib中用到了BMKMapView这个类,而代码中没有显示的引用,那可能会出现"xxx Class not found"之类的问题,这就需要在 buildSetting中加入 -all_load ,-ObjC 的参数,具体参考http://stackoverflow.com/questions/1725881/unknown-class-myclass-in-interface-builder-file-error-at-runtime
如果你的工程因为某种原因刚好不能加 -all_load ,-ObjC ,那就只能在 代码中调用一下 [BMKMapView class]; 之类的方法。可能需要在用到的地方都加入。。。
3)从xib中加载BMKMapView,然后黑屏,卡在 [[NSBundle mainBundle] loadNibNamed:@"XXXXXXXXXXX" owner:nil options:nil] 这个方法。
这个问题目前还没找到原因,也就更不知道解决方案了,这个问题是我的demo工程出现的,我把工程删掉,新建了一个工程,类没变,就没再出现这问题了。。。有点奇葩
4)编译不通过,提示xxxxxxxxx.o 里面有undefined symbol for i386 或者armv7 什么的,
又是一个奇葩的问题,它提示的意思是你a文件要么没有模拟器的包,要么没有真机的包,但实际上包合好了之后是都有的, 原因大概是因为xcode的什么优化导致a文件里面的东西没有加载进去
解决方法,参考2),如果还不行,就把sdk的文件全部删了,再add回来,不行clean一下再删一边。。。我的问题就是这么解决的。。。
5)地图 addAnnotation的方法位置不准,或者- (void)setCenterCoordinate:(CLLocationCoordinate2D)coordinate animated:(BOOL)animated;方法位置不准
这个问题不好描述,也是个比较奇葩的问题,原因感觉是有时候它是以annotationView的中心的定位的,有时候又是用annotationView的中间最下面那一点定位的,,,,这个有待考证
暂时的解决办法是,做了一张高度是原来标志图片两倍,宽度一样的图片,有问题的地方就替换。(这里描述的很渣,如果你碰到这个问题了那你估计知道我在说什么,如果没遇到就更好了)
暂时就这些,遇到再补充。
6)iOS8下,viewDidLoad 的时候,加载的view还是xib画出来的frame,直到viewDidLayoutsSubView以后才调整正确,所以在viewDidLoad的 时候 设置百度地图mapView的reion会出问题,之后再调整也不管用,它的center总是在错误frame的center处
解决方案:试了一下写在viewDidAppear不管用,所以暂时的做法是:在viewDidLoad里面,在初始化mapView之前,将self.view的frame手动设置好
即:
CGRect viewFrame = self.view.frame;
viewFrame.size.width = CGRectGetWidth([UIScreen mainScreen].bounds);
viewFrame.size.height = CGRectGetHeight([UIScreen mainScreen].bounds) - CGRectGetHeight(self.searchBar.bounds);
self.view.frame = viewFrame;
self.mapView = xxxxxxxxxxxx;