为什么百度地图didUpdateios userlocationn没调用

  最近仿照美团做了款应用,刚好用到百度地图,高德地图之前用的比较多,只是这个项目的后台服务器是另外一个公司做的,他们用的就是百度地图,现在网上用百度地图的还不算太多,博文也是断断续续的,主要是中间跳跃有点大,没有可运行的demo,看不到效果。纠结了好久,结合别人的总结和从百度官网上下载的demo,详细记录一下百度地图的使用过程,分享一下,也便于以后查阅使用。
  百度地图的使用和苹果一样,相对于高德地图来说规范了好多。直接将程序的bundle Identity和appkey值绑定,虽然刚开始用感觉有点不习惯,相信规范严谨对于国内的程序开发也算是一种引导吧。闲言少絮,下面开始百度地图的使用说明。
第一步:注册百度账号,申请appkey。直接上图片效果比较直接。,这里面有个小插曲,当初习惯性地将禁用服务ios地图sdk勾选上,做了无数次的测试一直不显示地图页面。纠结了好久,偶然间想到可能是appkey的问题,重新走了一遍,原来把禁用服务勾选上了,改过来就好了,做我们这行的严谨、认真还是很有必要地。
第二步:将百度地图sdk包添加到程序,在AppDelegate导入
#import&CoreLocation/CoreLocation.h&
#import "AGViewDelegate.h"
#import "BMapKit.h"
上述文件,添加如下委托和对象
@interface AppDelegate : UIResponder &UIApplicationDelegate,CLLocationManagerDelegate,BMKGeneralDelegate&
& & AGViewDelegate *_viewD//
& & BMKMapManager* _mapM//百度地图管理器 & &
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中调用开启百度地图定位的方法
- (void)configureAPIKey
& & _mapManager = [[BMKMapManager alloc] init];
& & BOOL ret = [_mapManager start:@"appkey"generalDelegate:self];
& & if (ret)
& & & & NSLog(@"百度地图开启定位:");
第三步:百度地图视图和百度位置服务的使用
在使用地图的页面导入百度地图文件
#import "BMapKit.h"
BMKMapViewDelegate,BMKLocationServiceDelegate委托对象
@property(nonatomic,retain)BMKMapView* baiduMapV//地图视图
@property(nonatomic,retain)BMKLocationService* locationS//百度地图定位服务对象
@synthesize baiduMapV
@synthesize locationS
当然不用的时候需要释放掉
if (baiduMapView)
& & & & [baiduMapView release];
& & & & baiduMapView =
& & if (locationService)
& & & & [locationService release];
& & & & locationService =
- (void)viewWillAppear:(BOOL)animated
& & [super viewWillAppear:animated];
& & baiduMapView.delegate =
& & locationService.delegate =
-(void)viewWillDisappear:(BOOL)animated
& & [baiduMapView viewWillDisappear];
baiduMapView.delegate =
& & locationService.delegate =
& & [super viewWillDisappear:animated];
当然在使用地图视图控件之前需要先开启百度地图的定位服务
//初始化定位服务对象
& & self.locationService = [[[BMKLocationService alloc]init]autorelease];
& & locationService.delegate=
//显示定位的蓝点儿必须先开启定位服务
& & [locationService startUserLocationService];
&接下来就是地图视图控件使用了
&& self.baiduMapView = [[[BMKMapView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)]autorelease];
& & //初始化百度地图对象
& & baiduMapView.delegate =
& & [baiduMapView setMapType:BMKMapTypeStandard];
& & baiduMapView.zoomLevel=17;//地图级别
& & //显示定位的蓝点儿必须先开启定位服务
& & [locationService startUserLocationService];
& & [baiduMapView setShowsUserLocation:NO];
& & baiduMapView.userTrackingMode=BMKUserTrackingModeN//地图模式
& & [baiduMapView setShowsUserLocation:YES];//显示定位的蓝点儿
& & coordinate.latitude = [XtomFunction xfuncGetAppdelegate].currentLocation.coordinate.//纬度
& & coordinate.longitude = [XtomFunction xfuncGetAppdelegate].currentLocation.coordinate.//经度
& & BMKCoordinateRegion viewRegion = BMKCoordinateRegionMake(coordinate, BMKCoordinateSpanMake(0.3,0.3));
& & BMKCoordinateRegion adjustedRegion = [baiduMapView regionThatFits:viewRegion];
& & [baiduMapView setRegion:adjustedRegion animated:YES];
到这里已经可以展示地图信息数据了,当然一些复杂的东西需要下面的委托实现
第四步:百度地图中常用委托方法的使用
&*用户方向更新后,会调用此函数
&*@param userLocation 新的用户位置
- (void)didUpdateUserHeading:(BMKUserLocation *)userLocation
& & [baiduMapView updateLocationData:userLocation];
& & NSLog(@"heading is %@,%f,%f,%f,%f,%f,%f",userLocation.heading,userLocation.location.coordinate.latitude,userLocation.location.coordinate.longitude,localLatitude,localLongitude,coordinate.latitude,coordinate.longitude);
& & NSLog(@"dingweifuwu:%f,%f",locationService.userLocation.location.coordinate.latitude,locationService.userLocation.location.coordinate.longitude);
& & NSLog(@"dangqian:%f,%f",locationService.userLocation.location.coordinate.latitude,locationService.userLocation.location.coordinate.longitude);
& & //改变成百度经纬度
& & AppDelegate *myDelegate = [XtomFunction xfuncGetAppdelegate];
& & myDelegate.currentLocation = userLocation.
& & myDelegate.myCoordinate=CLLocationCoordinate2DMake(userLocation.location.coordinate.latitude, userLocation.location.coordinate.longitude);*/
//开始缩放委托
- (void)mapView:(BMKMapView *)mapView regionWillChangeAnimated:(BOOL)
& & NSString* showmeg = [NSString stringWithFormat:@"地图区域发生了变化(x=%d,y=%d,\r\nwidth=%d,height=%d).\r\nZoomLevel=%d;RotateAngle=%d;OverlookAngle=%d",(int)baiduMapView.visibleMapRect.origin.x,(int)baiduMapView.visibleMapRect.origin.y,(int)baiduMapView.visibleMapRect.size.width,(int)baiduMapView.visibleMapRect.size.height,(int)baiduMapView.zoomLevel,baiduMapView.rotation,baiduMapView.overlooking];
& & NSLog(@"gesturescale:%@",showmeg);
& & CLLocationCoordinate2D firstLocation=[baiduMapView convertPoint:CGPointMake(0, 0) toCoordinateFromView:baiduMapView];
& & CLLocationCoordinate2D secondLocation=[baiduMapView convertPoint:CGPointMake(0, UI_View_Hieght+64) toCoordinateFromView:baiduMapView];
& & distance=[XtomFunction distanceBetweenOrderBy:firstLocation.latitude :firstLocation.longitude :secondLocation.latitude :secondLocation.longitude]/2;
& & //第一次获取数据的时候不加载
& & if (isFirstLoad)
& & & & localLatitude=baiduMapView.centerCoordinate.
& & & & localLongitude=baiduMapView.centerCoordinate.
& & & & //重新获取数据
& & & & [self requestGetLocationList];
//原理类似 UITableView 循环委托加载 CellforRowWithIndexPath
- (BMKAnnotationView *)mapView:(BMKMapView *)view viewForAnnotation:(id &BMKAnnotation&)annotation
& & //商家详情
& & if (isShangjia)
& & & & if ([annotation isKindOfClass:[BMKPointAnnotation class]])
& & & & & & // 生成重用标示identifier
& & & & & & NSString *AnnotationViewID = @"shangjia";
& & & & & & // 检查是否有重用的缓存
& & & & & & BMKAnnotationView* annotationView = [baiduMapView dequeueReusableAnnotationViewWithIdentifier:AnnotationViewID];
& & & & & & // 缓存没有命中,自己构造一个,一般首次添加annotation代码会运行到此处
& & & & & & if (annotationView == nil)
& & & & & & { annotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationViewID]; ((BMKPinAnnotationView*)annotationView).pinColor = BMKPinAnnotationColorR
& & & & & & & & // 设置重天上掉下的效果(annotation)
& & & & & & & & ((BMKPinAnnotationView*)annotationView).animatesDrop = YES; }
& & & & & & // 设置位置
& & & & & & annotationView.centerOffset = CGPointMake(0, -(annotationView.frame.size.height * 0.5)); annotationView.annotation =
& & & & & & // 单击弹出泡泡,弹出泡泡前提annotation必须实现title属性
& & & & & & annotationView.canShowCallout = YES;
& & & & & & //美食
& & & & & & if ([activityType isEqualToString:@"美食"])
& & & & & & {
& & & & & & & & annotationView.image=[UIImage imageNamed:@"美食图标.png"];
& & & & & & }
& & & & & & //丽人
& & & & & & else if ([activityType isEqualToString:@"丽人"])
& & & & & & {
& & & & & & & & annotationView.image=[UIImage imageNamed:@"丽人图标.png"];
& & & & & & }
& & & & & & //生活服务
& & & & & & else if ([activityType isEqualToString:@"生活服务"])
& & & & & & {
& & & & & & & & annotationView.image=[UIImage imageNamed:@"生活服务图标.png"];
& & & & & & }
& & & & & & //休闲娱乐
& & & & & & else if ([activityType isEqualToString:@"休闲娱乐"])
& & & & & & {
& & & & & & & & annotationView.image=[UIImage imageNamed:@"休闲娱乐图标.png"];
& & & & & & }
& & & & & & //旅游
& & & & & & else if ([activityType isEqualToString:@"旅游"])
& & & & & & {
& & & & & & & & annotationView.image=[UIImage imageNamed:@"旅游图标.png"];
& & & & & & }
& & & & & & //购物
& & & & & & else if ([activityType isEqualToString:@"购物"])
& & & & & & {
& & & & & & & & annotationView.image=[UIImage imageNamed:@"购物图标.png"];
& & & & & & }
& & & & & & //酒店
& & & & & & else if ([activityType isEqualToString:@"酒店"])
& & & & & & {
& & & & & & & & annotationView.image=[UIImage imageNamed:@"酒店图标.png"];
& & & & & & }
& & & & & & //今日订单
& & & & & & else if ([activityType isEqualToString:@"今日订单"])
& & & & & & {
& & & & & & & & annotationView.image=[UIImage imageNamed:@"今日订单图标.png"];
& & & & & & }
& & & & & & //annotationView.image=[UIImage imageNamed:@"丽人图标.png"];
&& & & & & &
& & & & & & // 设置是否可以拖拽
& & & & & & annotationView.draggable = NO;
& & & & & & return annotationV
&& & & & & &
& & & & & & /*
&& & & & & & BMKPinAnnotationView *newAnnotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"myAnnotation"];
& & & & & & &
&& & & & & & newAnnotationView.pinColor = BMKPinAnnotationColorP
& & & & & & &
&& & & & & & newAnnotationView.animatesDrop = YES;// 设置该标注点动画显示
& & & & & & &
&& & & & & & newAnnotationView.annotation=
& & & & & & &
&& & & & & & newAnnotationView.image = [UIImage imageNamed:@"丽人图标.png"]; & //把大头针换成别的图片
& & & & & & &
&& & & & & & return newAnnotationV*/
&& & & & & &
& & else if (isLuxian)
& & & & if ([annotation isKindOfClass:[RouteAnnotation class]])
& & & & & & return [self getRouteAnnotationView:view viewForAnnotation:(RouteAnnotation*)annotation];
这里介绍一下百度地图中常见的两个点,花费了我好长的时间总结出来的,分享一下吧。比如获取百度地图中当前的位置,可以在开启百度位置服务,走完
- (void)didUpdateUserHeading:(BMKUserLocation *)userLocation委托方法后,通过
locationService.userLocation.location.coordinate获得 &
再比如 想获取当前地图的中心点的经纬度 可以这样获得baiduMapView.centerCoordinate 还有百度地图中坐标点和地图中经纬度的转换
CLLocationCoordinate2D firstLocation=[baiduMapView convertPoint:CGPointMake(0, 0) toCoordinateFromView:baiduMapView];这个是远点的经纬度
第四步:自定义标注的添加
//添加大头钉
& & & & BMKPointAnnotation* annotation = [[BMKPointAnnotation alloc]init];
& & & & CLLocationCoordinate2D
& & & & coor.latitude = localL
& & & & coor.longitude = localL
& & & & annotation.coordinate =
& & & & //annotation.title = @"这里是北京";
& & & & [baiduMapView addAnnotation:annotation];
//原理类似 UITableView 循环委托加载 CellforRowWithIndexPath
- (BMKAnnotationView *)mapView:(BMKMapView *)view viewForAnnotation:(id &BMKAnnotation&)annotation委托方法实现,当然还有个获取选中哪个大头钉或者标注点的委托方法
//当选中一个annotation views时,调用此接口
- (void)mapView:(BMKMapView *)mapView didSelectAnnotationView:(CustomAnnotationView *)view
& & //只展示首页的大头钉
& & if (isLuxian||isShangjia)
& & //获取点击视图的区域
& & CLLocationCoordinate2D leftTopLocation=[baiduMapView convertPoint:CGPointMake(view.frame.origin.x, view.frame.origin.y) toCoordinateFromView:baiduMapView];
& & CLLocationCoordinate2D rightDownLocation=[baiduMapView convertPoint:CGPointMake(view.frame.origin.x+view.frame.size.width, view.frame.origin.y+view.frame.size.height) toCoordinateFromView:baiduMapView];
& & //临时数组
& & NSMutableArray *tempArray=[[[NSMutableArray alloc]init]autorelease];
& & for (int i = 0; i&detailData. i++)
& & & & NSMutableDictionary *dict = [[[NSMutableDictionary alloc] init] autorelease];
& & & & NSDictionary *temDict = [detailData objectAtIndex:i];
& & & & for(NSString *key in temDict.allKeys)
& & & & & & NSString *value = [temDict objectForKey:key];
& & & & & & if(![XtomFunction xfunc_check_strEmpty:value])
& & & & & & {
& & & & & & & & [dict setObject:value forKey:key];
& & & & & & }
& & & & //纬度
& & & & float tempLat=[[temDict objectForKey:@"lat"]floatValue];
& & & & //经度
& & & & float tempLng=[[temDict objectForKey:@"lng"]floatValue];
& & & & NSLog(@"jingweidu:%f,%f,%f,%f,%f,%f",leftTopLocation.latitude,leftTopLocation.longitude,rightDownLocation.latitude,rightDownLocation.longitude,tempLat,tempLng);
& & & & //获取该区域下的数据
& & & & if (tempLat &=rightDownLocation.latitude&&tempLat &=leftTopLocation.latitude&&tempLng &=leftTopLocation.longitude&&tempLng &=rightDownLocation.longitude)
& & & & & & [tempArray addObject:temDict];
& & NSLog(@"shuzu:%@",tempArray);
& & [view.superview insertSubview:view atIndex:1000];
& & view.temArr=tempA
& & view.biaozhu.dataSource=tempA
& & [view loadTableData];
& & [view retain];
}也一并分享一下吧。
第五步:百度地图中公交线路信息的获取和公交路线的绘制
公交、地铁、汽车、步行这几个是常见的东西这个比较麻烦一些,感兴趣的可以去百度地图的demo中查询,我给出链接吧。http://download.csdn.net/detail/kuuailetianzi/7907889 至此,百度地图的使用介绍的差不多了,我也该休息休息了。
阅读(...) 评论()(1)编译正常,运行报 [UIDevice uniqueGlobalDeviceIdentifier]: unrecognized selector sent to此时需要 other linker flags 添加 -all_load参数。
具体:Project -&build settings -&linking-&Other Linker flags(2)编译报
Undefined symbols for architecture armv7。请检查有没有添加QuartzCore.framework 和 CoreLocation.framework
BMKMapManager 强烈建议通过单例模式管理起来,并且不要手动调用其release方法。
进行用户位置定位时除了要设置showsUserLocation = YES,还要在mapView:didUpdateUserLocation:方法中调用setCenterCoordinate:animated
另外一定要在dealloc中,或者其他离开页面的地方调用showsUserLocation= NO,否则会出现第二次push到定位页面时,不会重新定位问题。
(5) 至少让一个类保持.mm文件,或者按照官方修改编译器类型。(6) lipo &create Release-iphoneos/libbaidumapapi.a Release-iphonesimulator/libbaidumapapi.a &output libbaidumapapi.a 如果报错,请改成
lipo &create &output libbaidumapapi.a Release-iphoneos/libbaidumapapi.a Release-iphonesimulator/libbaidumapapi.a 就能解决。
-[__NSCFString stringFromMD5]
other linker
flags 添加 -all_load参数
经过实践,我推荐不这么干,默认是根据文件类型来选择编译的方式,文件要是.m就用Objective-C,要是.mm就是Objective-C++,手动改变会让整个项目都用一种编译方式,很容易出错或者不兼容,比如NavigationItem实例化的时候就会出错,既然百度地图如此特立独行,那么最好的方式就是把地图相关的类改为.mm,其他的依旧,这样只有这个类会用Objective-C++编译方式
百度地图不显示文字:因为没有设置mapView宽高
阅读(...) 评论()iOS百度地图问题总结(三) - 简书
<div class="fixed-btn note-fixed-download" data-toggle="popover" data-placement="left" data-html="true" data-trigger="hover" data-content=''>
写了114206字,被693人关注,获得了719个喜欢
iOS百度地图问题总结(三)
关于导入百度地图SDK出现的问题(一)
1.MKAnnotationView和MKPinAnnotationView的区别.
如果想创建以静态图片作为大头针图片的话,可以通过创建MKAnnotationView是实例。如果想使用apple自带的大头针则创建MKPinAnnotationView.
2.Undefined symbols for architecture x86_64
错误原因:一般是指用到的第三方框架不支持64位手机
无标题1.png
将5改为$(ARCHS_STANDARD)_32_BIT
3. Terminating app due to uncaught exception ‘NSInvalidUnarchiveOperationException’,reason ‘Could not instantiate class named MKMapView’ 解决办法:如果sotoryboard中用到了地图,必须手动导入框架MapKit.framework.
4.使用百度地图api不显示当前位置的蓝点,如下代码
- (void)viewDidLoad {
[super viewDidLoad];
_locService = [[BMKLocationService alloc] init]; _locService.delegate =
_mapView = [[BMKMapView alloc] initWithFrame:[UIScreen mainScreen].bounds];
if ([[UIDevice currentDevice].systemVersion doubleValue] &= 8.0) {
// 主动请求权限
self.mgr = [[CLLocationManager alloc] init];
self.mgr.delegate =
[self.mgr requestAlwaysAuthorization];
[self.view addSubview:_mapView];
[_locService startUserLocationService]; _mapView.userTrackingMode = BMKUserTrackingModeF//设置定位的状态
_mapView.showsUserLocation = YES;//显示定位图层
*用户位置更新后,会调用此函数
*@param userLocation 新的用户位置
- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation{
[_mapView updateLocationData:userLocation];
if (userLocation != nil) {
NSLog(@"%f %f", userLocation.location.coordinate.latitude, userLocation.location.coordinate.longitude);
5.百度地图BMKMapViewDelegate的-mapView:viewForAnnotation:函数不调用
解决办法:看看mapview的delegate是不是在viewWillAppear里面 如果是的话,viewDidLoad肯定是先于viewWillAppear被叫的,所以不会调用。
下面是 demo 下载地址:
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
【最新投稿方式】
为了保证专题文章的质量,暂时关闭投稿申请,改为【私信文章链接】给本专题的管理员 (花前月下) (判若...
· 8047人关注
为了让更多的人体验编程的快乐,不管您是大牛还是牛犊,欢迎您投稿,让我们建立一个资源库,根据投稿的相对质量,我们会给您一定的打赏
· 382人关注
· 92人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:

我要回帖

更多关于 ios location update 的文章

 

随机推荐