iOS百度地图开发中遇到的问题

作者: hrscy | 来源:发表于2015-12-24 21:32 被阅读5953次

由于项目需要地图功能,公司决定使用百度地图,但是百度地图也有很多问题,现在总结一下在百度地图中遇到的坑,希望给各位看官一点参考,避免走一些弯路.我使用的百度地图SDK2.9.1.

iOS地图SDK链接,上面的连接是一些注意事项.

(一)关于定位的一些设置

//初始化定位服务
_locService = [[BMKLocationService alloc] init];
//设置距离过滤器(默认距离是米)
_locService.distanceFilter = 10;
//设置定位精度
_locService.desiredAccuracy = kCLLocationAccuracyBest;
//开启定位服务
[_locService startUserLocationService];
//指定定位:是否允许后台定位更新。默认为NO。只在iOS 9.0之后起作用
if ([[UIDevice currentDevice].systemVersion doubleValue] >= 9) {
        _locService.allowsBackgroundLocationUpdates = YES;
}
//设置定位的状态
_mapView.userTrackingMode = BMKUserTrackingModeNone;
//显示定位图层
_mapView.showsUserLocation = YES;
//设置定位图层自定义样式
BMKLocationViewDisplayParam *userlocationStyle = [[BMKLocationViewDisplayParam alloc] init];
//精度圈是否显示
userlocationStyle.isRotateAngleValid = YES;
//跟随态旋转角度是否生效
userlocationStyle.isAccuracyCircleShow = NO;
//定位图标
userlocationStyle.locationViewImgName = [UIImage imageNamed:@"图标名称"];
//更新参样式信息
[_mapView updateLocationViewWithParam:userlocationStyle];

(二)关于当前定位位置

首先,显示当前位置,百度地图提供了三种模式:

typedef enum {
    BMKUserTrackingModeNone = 0,             /// 普通定位模式
    BMKUserTrackingModeFollow,               /// 定位跟随模式
    BMKUserTrackingModeFollowWithHeading,    /// 定位罗盘模式
} BMKUserTrackingMode;
定位模式

使用下面代码就能设置定位状态:

//设置定位的状态
    _mapView.userTrackingMode = BMKUserTrackingModeNone;

普通定位模式没有问题,但是如果设置定位跟随或定位罗盘模式,运行app,你会发现定位点确实是对应的状态,但是当你拖动地图的时候,你就会发现后两种模式,又变回了普通定位模式.

我问了百度地图的工程师,他们说这是当前的策略...

所以我感觉设置跟随模式和罗盘模式没有什么卵用...

(三)关于用户方向更新后的设置

如上面(一)所述,定位点可是设置样式参数,当你自定义了定位图标后,你会发现定位图标确实换为了自己定义的图标,而且当用户方向更新后,定位图标是回发生旋转的,但是当你点击触摸屏幕后,定位图标马上变为初始的情况,并且用户方向更新,定位图标不在发生变化.

对于这种情况,我想了一个办法,就是使用系统的定位,在地图界面添加一个方向的图标,如下图:

代码如下:

- (void)viewDidLoad {
    //版本号
    if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
        //主动请求权限
        [self.mgr requestAlwaysAuthorization];
    }
    if ([[UIDevice currentDevice].systemVersion doubleValue] >= 9) {
        self.mgr.allowsBackgroundLocationUpdates = YES;
    }
    //对系统定位进行设置
    self.mgr.delegate = self;
    [self.mgr startUpdatingLocation];
    //开始监听(开始获取位置)
    [self.mgr startUpdatingHeading];
}
//pragma mark -用户方向更新后,会调用此函数
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {
    // 将获取到的角度转为弧度 = (角度 * π) / 180;
    CGFloat angle = newHeading.magneticHeading * M_PI / 180;
    // 旋转图片
    self.compasspointer.transform = CGAffineTransformMakeRotation(-angle);
}
//pragma mark - 懒加载
- (CLLocationManager *)mgr
{
    if (!_mgr) {
        _mgr = [[CLLocationManager alloc] init];
    }
    return _mgr;
}

当然如果觉得这种处理不好,可以再想其他解决办法~

(四)关于app切换到后台产生的问题

当app切换到后台再切换回前台,mapView可能会产生黑屏的情况,此时只需在AppDelegate.m中的applicationWillResignActive:(UIApplication *)applicationapplicationDidBecomeActive:(UIApplication *)application添加如下代码:

- (void)applicationWillResignActive:(UIApplication *)application {
    //程序将要进入后台
    [BMKMapView willBackGround];
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
    //程序进入前台
    [BMKMapView didForeGround];
}

(五)关于BMKLocationServiceDelegate

设置定位的委托有如下两种方式:

  • 方式1:
- (void)viewDidLoad {
    [super viewDidLoad];
    _mapView.delegate = self; 
    _locService.delegate = self;
}
-(void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    _locService.delegate = nil;
}
  • 方式2
-(void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    _locService.delegate = nil;
}
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    _locService.delegate = self;
}

上面两种方式的区别:

如果在viewDidLoad里写定位委托的话,加载完mapView后,定位当前位置是可以正常显示,并且可以随着位置的变化,定位点也随之发生变化.如果切换到后台,然后再切换回mapView界面,定位点还是会变化.但是会产生一个问题,当点击别的tabbar,切换到别的界面后,再切换回mapView界面,定位点就不再随着位置的变化而发生变化了.

如果采用方式2的话,就会避免这种问题.

(六)关于标注与当前位置间距离的计算

    //设置标注的经纬度坐标
    CGFloat latitude = 39.915168;
    CGFloat longitude = 116.403875;
    anno.coordinate = CLLocationCoordinate2DMake(latitude, longitude);
    //计算所选坐标和当前位置之间的距离
    CLLocationCoordinate2D currentAnno = CLLocationCoordinate2DMake(latitude, longitude);
        BMKMapPoint mp1 = BMKMapPointForCoordinate(currentAnno);
        BMKMapPoint mp2 = BMKMapPointForCoordinate(userLocation.location.coordinate);
        //distance的单位是米
        CLLocationDistance distance = BMKMetersBetweenMapPoints(mp1, mp2);

最后,需要说明一下,系统地图和高德地图我也用过了,用法和百度地图非常相似,尤其是高德地图,更是相似,很多地方都是把前缀换一下就OK了,其他代码都不用改,但是有个别地方还是有区别的,比如说百度地图的paopaoView,高德地图和百度地图是不一样的.

相关文章

  • 百度地图使用-大头针的自定义

    最近老看到iOS开发群里有人问有关百度地图的问题,正好研究过百度地图,今天我就把自己集成百度地图相关功能和遇到问题...

  • 如何有效降低iOS百度地图线上崩溃率

    我想有很多iOS团队在使用百度地图中遇到过线上崩溃率高的问题,我在58速运的开发过程中持续和百度地图的崩溃作斗争。...

  • iOS百度地图开发中遇到的问题

    由于项目需要地图功能,公司决定使用百度地图,但是百度地图也有很多问题,现在总结一下在百度地图中遇到的坑,希望给各位...

  • iOS跳转第三方地图导航

    在iOS开发应用过程中,会遇到跳转第三方应用地图进行导航的场景,例如跳转到高德地图,百度地图.如图所示 首先,如果...

  • iOS 开发中你是否遇到这些经验问题(二)

    iOS 开发中你是否遇到这些经验问题(二) iOS 开发中你是否遇到这些经验问题(二)

  • iOS 开发中你是否遇到这些经验问题

    iOS 开发中你是否遇到这些经验问题(二) iOS 开发中你是否遇到这些经验问题(二)

  • iOS地图的使用

    在iOS开发中要用到地图时选择很多,例如第三方的高德地图、百度地图都是很好的选择,当然最基础的则是iOS中自带的地...

  • 常用网址

    环信:http://www.easemob.com/customer/im IOS百度地图开发系列-百度地图不能正...

  • 百度地图之mapapi.bundle

    集成百度地图iOS SDK时遇到“地图所需资源文件不完整,请根据开发指南正确添加mapapi.bundle文件”的...

  • iOS 10开发百度地图poi

    百度地图向来比较坑的,虽然在开发文档中写了很多可能出现的问题,但还是没有做到穷尽,在开发过程中能遇到的问题...

网友评论

  • 烈马痴情葱:地图不显示精度圈,怎么搞?谢谢!
    烈马痴情葱:我试了下还是不出来,是不是自定义的annotation不会有精度圈?
    一束强光:就是这句
    userlocationStyle.isAccuracyCircleShow = NO;
  • Easy_VO:
    [_mapView setCenterCoordinate:sparkCoor animated:NO];
    切换城市无效,何姐?
  • 黑白灰的绿i:怎样判断当前使用的是不是离线地图呢
  • 夙挽清歌:最新版SDK,willBackGround和didForeGround方法废弃了,但是前后切换出现黑屏,该怎么解决呢?
    王大吉Rock:@我系哆啦 但是发生的概率还是很小的,特别是跳转到三方应用的时候。还是高德好点
    我系哆啦:@_故事的小黄瓜_ +1,还是有时候会出现黑屏,随机的
    王大吉Rock:我也很想知道,我这里的情况,是跳转到系统导航会出现这样的情况
  • 巴图鲁:膜拜
  • 孙公瑾i:self.mgr 是什么属性呢
  • 独孤九剑21:我的程序不显示定位地点的图标,能把程序发下给我参考下么?huangdongxu21@sina.com,不胜感激!

本文标题:iOS百度地图开发中遇到的问题

本文链接:https://www.haomeiwen.com/subject/lewvhttx.html