iOS百度地图SDK之实时绘制轨迹(后台仍执行)
首先,对于百度地图SDK的配置和环境搭建就不做说明,需要的人可以博客中另一篇文章看 《iOS百度地图SDK基本使用》 ,本文的重点在于实现实时绘制轨迹的功能,并且对细节进行处理和优化
1、在AppDelegate.m文件中
#import "AppDelegate.h"
// BMapKit.h代表导入了所有的头文件
#import <BaiduMapAPI/BMapKit.h>
@interface AppDelegate ()<BMKGeneralDelegate>
{BMKMapManager *mapManager;
}
@end
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {// 要使用地图,首先需要初始化和启动BMKMapManagermapManager = [[BMKMapManager alloc]init];// 填入验证码, 如需要使用网络和授权验证服务,则需要设置代理信息BOOL ret = [mapManager start:@"在这里填入的是密钥中的安全码" generalDelegate:nil];if (!ret) {NSLog(@"地图管理器初始化失败");}else{NSLog(@"初始化成功");}return YES;
}
#import "ViewController.h"
#import <BaiduMapAPI/BMapKit.h>#define normalLocationTag 1
#define compassLocationTag 2@interface ViewController () <BMKLocationServiceDelegate , BMKMapViewDelegate>
{BMKMapView *mapView;BMKLocationService *locationService;// 用于手动验证CLLocationManager *locationManager;// 用于记录经过的点NSMutableArray *locationPoint;// 在地图上绘制的折线BMKPolyline *routeLine;// 中间变量->location类型(地理位置)CLLocation *currentLocation;
}
@end
- (void)viewDidLoad {[super viewDidLoad];// 1、所有的初始化操作[self initObjects];// 2、所有的地图初始操作[self operationForMap];
}
- (void)initObjects
{// 初始化mapViewmapView = [[BMKMapView alloc]initWithFrame:CGRectMake(0, 120, self.view.bounds.size.width, self.view.bounds.size.height)];// 初始化locationServicelocationService = [[BMKLocationService alloc]init];
}
- (void)operationForMap
{// 设置过滤距离,更新的最小间隔距离[BMKLocationService setLocationDistanceFilter:6.0f];// 设置定位精度模式/* tips:以前使用了kCLLocationAccuracyBest--> 表示在使用电池的最高精度现在使用了kCLLocationAccuracyBestForNavigation--> 表示在外接电源的时候的最高精度(有些在AppStore上架的APP由于过度依赖于高精度的定位,所以采用了这种耗电的定位设置)*/[BMKLocationService setLocationDesiredAccuracy:kCLLocationAccuracyBestForNavigation];// 设置地图类型mapView.mapType = BMKMapTypeSatellite;// 设置是否需要热力图显示[mapView setBaiduHeatMapEnabled:NO];// 设置是否允许旋转地图mapView.rotateEnabled = YES;<span style="white-space:pre"> </span>// .....对于地图还有很多设置,这里不一一列举,需要的话可以在文档中查到<span style="white-space:pre"> </span>[self.view addSubview:mapView];
}
- (void)operationForLocation:(BMKUserLocation *)userLocation
{// 1、检查移动的距离,移除不合理的点if (locationPoint.count > 0) {CLLocationDistance distance = [userLocation.location distanceFromLocation:currentLocation];if (distance < 5)return;}// 2、初始化坐标点数组if (nil == locationPoint) {locationPoint = [[NSMutableArray alloc] init];}// 3、将合理的点添加到数组[locationPoint addObject:userLocation.location];// 4、作为前一个坐标位置辅助操作currentLocation = userLocation.location;// 5、开始画线[self configureRoutes];// 6、实时更新用户位子[mapView updateLocationData:userLocation];
}
#pragma mark - 点击两个button触发的事件
- (IBAction)startLocation:(UIButton *)button
{// 由于IOS8中定位的授权机制改变 需要进行手动授权(导致程序无法进行定位的主要原因)if ([[UIDevice currentDevice].systemVersion floatValue] >= 8) {locationManager = [[CLLocationManager alloc] init];[locationManager requestAlwaysAuthorization];[locationManager requestWhenInUseAuthorization];}// 开启用户定位[locationService startUserLocationService];// 开始先关闭地位图层(也就是定位的小圆点)-->用户体验问题mapView.showsUserLocation = NO;// 根据所点击的button来开启不同的定位模式if (button.tag == normalLocationTag) {mapView.userTrackingMode = BMKUserTrackingModeFollow;}else if(button.tag == compassLocationTag) {mapView.userTrackingMode = BMKUserTrackingModeFollowWithHeading;}mapView.showsUserLocation = YES;// 1、通过比例调试地图的显示
#if 1[mapView setZoomEnabled:YES];mapView.zoomLevel = 19;// 级别是 3-19
#endif#if 0// 2、通过范围调试地图的显示BMKCoordinateRegion adjustRegion = [mapView regionThatFits:BMKCoordinateRegionMake(locationService.userLocation.location.coordinate, BMKCoordinateSpanMake(0.03f,0.03f))];[mapView setRegion:adjustRegion animated:YES];
#endif
}
#pragma mark - 视图的出现和消失(在其中设置代理和取消代理,优化内存管理)
- (void)viewWillAppear:(BOOL)animated
{[mapView viewWillAppear];mapView.delegate = self;locationService.delegate = self;
}- (void)viewWillDisappear:(BOOL)animated
{[mapView viewWillDisappear];// 一般情况下都需要在这里关闭掉代理,但是由于本程序需要在后台继续绘制轨迹,因为对应的代理方法是绘制轨迹,所以继续设置代理mapView.delegate = self;locationService.delegate = self;
}
#pragma mark - mapView的协议
- (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id<BMKOverlay>)overlay
{if ([overlay isKindOfClass:[BMKPolyline class]]) {BMKPolylineView *polylineView = [[BMKPolylineView alloc]initWithPolyline:overlay];// 设置划出的轨迹的基本属性-->也是使得定位看起来更加准确的主要原因polylineView.strokeColor = [[UIColor blueColor]colorWithAlphaComponent:0.5];polylineView.fillColor = [[UIColor blueColor]colorWithAlphaComponent:0.8];polylineView.lineWidth = 6.0;return polylineView;}return nil;
}
#pragma mark - 绘制轨迹
-(void)configureRoutes
{// 1、分配内存空间给存储经过点的数组BMKMapPoint* pointArray = (BMKMapPoint *)malloc(sizeof(CLLocationCoordinate2D) * locationPoint.count);// 2、创建坐标点并添加到数组中for(int idx = 0; idx < locationPoint.count; idx++){CLLocation *location = [locationPoint objectAtIndex:idx];CLLocationDegrees latitude = location.coordinate.latitude;CLLocationDegrees longitude = location.coordinate.longitude;CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(latitude, longitude);BMKMapPoint point = BMKMapPointForCoordinate(coordinate);pointArray[idx] = point;}// 3、防止重复绘制if (routeLine) {//在地图上移除已有的坐标点[mapView removeOverlay:routeLine];}// 4、画线routeLine = [BMKPolyline polylineWithPoints:pointArray count:locationPoint.count];// 5、将折线(覆盖)添加到地图if (nil != routeLine) {[mapView addOverlay:routeLine];}// 6、清楚分配的内存free(pointArray);
}
#pragma mark - 更新用户位置时所调用的三种方法
// 更新位置
- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation
{// 说明:由于开启了“无限后台”的外挂模式(^-^)所以可以直接写操作代码,然后系统默认在任何情况执行,但是为了已读,规划代码如下// 1、活跃状态if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive) {[self operationForLocation:userLocation];}else if([UIApplication sharedApplication].applicationState == UIApplicationStateBackground)// 2、后台模式{[self operationForLocation:userLocation];}// 3、不活跃模式else if ([UIApplication sharedApplication].applicationState == UIApplicationStateInactive){[self operationForLocation:userLocation];}
}// 更新方向
- (void)didUpdateUserHeading:(BMKUserLocation *)userLocation
{[mapView updateLocationData:userLocation];
}// 定位失败了会调用
- (void)didFailToLocateUserWithError:(NSError *)error
{NSLog(@"did failed locate,error is %@",[error localizedDescription]);
}
到这里,代码就结束了,在viewWillDisappear中,依然没有关掉代理,是想让程序在锁屏后,或者是点击home键返回到桌面后仍然执行轨迹的绘制,但是仅仅设置代理是不够的,在没有进行配置的情况下,iOS系统最多可以让一个APP在有5秒钟的时间,用来进行保存和清理资源等任务。如果应用调用了UIApplication的beginBackgroundTaskWithExpirationHandler的方法,可以让APP在后台有10分组的运行时间,用来清理本地的缓存或者是进行数据的处理。超过了时间,APP便会被强制挂起
但是,就拿本例中所涉及的实时绘制轨迹来说,比如要开发一款跑步时绘制自己轨迹的应用,总不能跑步的时候都要将手机屏幕开着,并且还不能切换到其他地方,这样无疑增加了大量的电量消耗,所以,苹果也是为以下的几种提供了所谓的“无限后台”的外挂模式
所以,对于本例来说,苹果是允许启动外挂模式的,下面说明应该怎么配置这种模式
但是有人会想,那这样的话每个程序都可以开外挂了咯?话虽如此,但是在AppStore审核的时候,如果在plist文件中配置了这样的属性,那么AppStore会检测应用程序是否属于这种类型,如果不是的话,那么这样的APP就会被拒绝。
iOS百度地图SDK之实时绘制轨迹(后台仍执行)相关推荐
- 百度地图API根据经纬度绘制轨迹图(Vue附源码)
目录 导入百度地图 绘制轨迹 左侧点击事件添加窗口 页面完整代码 有用可以点个关注,收藏!! vue版本百度地图官方组件:https://dafrok.github.io/vue-baidu-map/ ...
- android 记录路线轨迹_基于百度地图SDK记录运动轨迹
标签 : 运动轨迹 百度地图SDK 最终实现的效果如下图所示### 注意1:模拟器上模拟要设置好Location(如果选择None就无法定位了),同时第一次打开应用会提示授权使用地理位置信息,点击允许 ...
- Android studio 百度地图SDK之地图定位与运动轨迹绘制
百度地图定位与运动轨迹 Android开发的前期准备 地图图层显示与定位 运动轨迹的简单绘制 Android开发的前期准备 Android配置在百度地图SDK官网上有详细的说明.具体可以参考官网的教程 ...
- 百度地图SDK for iOS v2.0.1全新发布
百度地图SDK for iOS v2.0.1全新发布! 百度地图 iOS SDK是一套基于iOS4.3及以上(iOS SDKv1.2.3及以前版本支持iOS3.0及以上)版本设备的应用程序接口,不仅提 ...
- 百度地图SDK for iOS v2.0.0全新发布
百度地图SDK for iOS v2.0.0全新发布,全新矢量版地图,全新视觉体验! 百度地图 iOS SDK是一套基于iOS4.3及以上(iOS SDKv1.2.3及以前版本支持iOS3.0及以上) ...
- 百度地图 sdk 使用小结(行动轨迹)
最近把之前的地图代码再看了一遍,想借此机会小结一番,下面是效果图,点没取好,凑合看吧. 这里做的是一个地图上的行为轨迹,包含各个点的覆盖物以及路线绘制,需要用到百度地图定位 SDK,具体如何引入百度地 ...
- 百度地图SDK for iOS v2.1.1全新发布
2013年12月5日 百度地图iOS SDK : V2.1.1矢量版SDK上线 新增: 新增调启百度地图导航的接口(百度地图导航和Web端导航) 在BMKNavigation中新增类枚举类型的数据结构 ...
- IOS接入百度地图SDK,百度定位SDK记录
地图显示 Xcode新建一个项目,我取名叫BaiduMapIOSAgain,包名为com.unity.BaiduMapIOSAgain. 在百度SDK的控制台创建应用,过程略,跟着官方说明即可 首先先 ...
- android百度地图固定屏幕标注绘制,关于最新百度地图sdk如何使覆盖物固定在屏幕(MapView)中心...
关于最新百度地图sdk如何使覆盖物固定在屏幕中心 最近为了完成课程设计,接触了百度地图API,我现在用的版本是Android地图sdk v3.3.0,也是目前的最新发布了,相对于之前的版本还是有挺大的 ...
最新文章
- 一小时Docker教程
- ​冲刺最后一公里——音视频场景下的边缘计算实践
- Nginx调度器(反向代理)
- 在SQL Server2005中使用 .NET程序集
- pandas处理日期的几种常用方法
- Java File类详解
- 埃氏筛 线性筛(欧拉筛) 算法解析
- 固态和机械硬盘组raid_联想G400拆机步骤(固态硬盘替换机械硬盘,机械硬盘替换光驱)...
- SPSS 多重共线性问题【SPSS 039期】
- mysql odbc 免安装_MySQL免安装版配置
- 如何使用Everything搜索局域网共享文件夹?
- R语言RSelenium包爬取动态网页数据前期准备(环境配置)-连载NO.01
- 沈航计算机复试刷人,考研复试刷人严重吗被刷机率大吗
- vue项目-android版本引入微信录音
- webrtc 的回声抵消(aec、aecm)算法简介(转)
- 操作animate.css的一些小技巧
- 关于DirectX的一些知识
- Windows Server 2012 r2 The system cannot write to the specifi
- 通过了华为认证可以涨薪吗?
- html5毕业作品开场白,毕业设计开场白怎么写