项目需要,加了长时间后台定位(计时器控制后台运行时间),现在把代码发给大家哈
本人只测试了定时一小时控制后台获取位置信息,肯定可以更长时间的运行,不过耗电那是当然的了,所以做类似软件一定要先提醒用户,避免被拒和被用户差评!
一、首先。在Info.plist里面添加Key:Required background modes
Value:App registers for location updates
二、初始化
#define RUNTIME 60*60//当然是控制在一小时以内
- (void)viewDidLoad
{
[superviewDidLoad];
[self initData];
//响应后台
[[NSNotificationCenterdefaultCenter] addObserver:selfselector:@selector(applicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotificationobject:nil];
}
//初始化数据
-(void)initData{
backgroundUpdateInterval= RUNTIME;//设置计时器时间
self._saveLocations = [[NSMutableArray alloc] init];
self._locationManager= [[CLLocationManageralloc] init];
self._locationManager.desiredAccuracy= kCLLocationAccuracyBest;
self._locationManager.delegate= self;
[self._locationManagerstartUpdatingLocation];
}
三、更新定位
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
//在地图上加大头针
MKPointAnnotation*annotation = [[MKPointAnnotationalloc] init];
annotation.coordinate = newLocation.coordinate;
[self._mapView addAnnotation:annotation];//
[self._saveLocations addObject:annotation];
if(UIApplication.sharedApplication.applicationState== UIApplicationStateActive)
{
if(backgroundTask!= UIBackgroundTaskInvalid)//如果后台没有关闭,结束
{
[[UIApplicationsharedApplication] endBackgroundTask:backgroundTask];
backgroundTask= UIBackgroundTaskInvalid;
}
//显示所有的大头针
for (MKPointAnnotation *annotation in self._saveLocations)
{
CLLocationCoordinate2D coordinate = annotation.coordinate;
MKCoordinateRegionregion=MKCoordinateRegionMakeWithDistance(coordinate,storedLatitudeDelta,storedLongitudeDelta);
MKCoordinateRegion adjustedRegion = [_mapView regionThatFits:region];
[_mapView setRegion:adjustedRegion animated:NO];
}
}
else
{
NSLog(@"applicationD in Background,newLocation:%@", newLocation);
}
}
四、后台加入计时器
//用定时器控制后台运行定位时间
-(void)applicationDidEnterBackground:(NSNotificationCenter *)notication{
UIApplication* app = [UIApplicationsharedApplication];
backgroundTask= [app beginBackgroundTaskWithExpirationHandler:^{
NSLog(@"applicationD in Background");
}];
//加入定时器,用来控制后台运行时间
self._updateTimer= [NSTimerscheduledTimerWithTimeInterval:backgroundUpdateInterval
target:self
selector:@selector(stopUpdate)
userInfo:nil
repeats:YES];
[[NSRunLoopcurrentRunLoop] addTimer:self._updateTimerforMode:NSRunLoopCommonModes];
}
五、计时时间到,停止后台运行与定位
-(void)stopUpdate{
[self._locationManagerstopUpdatingLocation];
[self._updateTimerinvalidate];
self._updateTimer= nil;
if(backgroundTask!= UIBackgroundTaskInvalid)
{
[[UIApplicationsharedApplication] endBackgroundTask:backgroundTask];
backgroundTask= UIBackgroundTaskInvalid;
}
}
六、用模拟器测试方法
用模拟器测试的时候选择:调试-位置-后三者都行
然后在控制台就可以看到后台输出的信息了
本人只测试了定时一小时控制后台获取位置信息,肯定可以更长时间的运行,不过耗电那是当然的了,所以做类似软件一定要先提醒用户,避免被拒和被用户差评!
一、首先。在Info.plist里面添加Key:Required background modes
Value:App registers for location updates
二、初始化
#define RUNTIME 60*60//当然是控制在一小时以内
- (void)viewDidLoad
{
[superviewDidLoad];
[self initData];
//响应后台
[[NSNotificationCenterdefaultCenter] addObserver:selfselector:@selector(applicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotificationobject:nil];
}
//初始化数据
-(void)initData{
backgroundUpdateInterval= RUNTIME;//设置计时器时间
self._saveLocations = [[NSMutableArray alloc] init];
self._locationManager= [[CLLocationManageralloc] init];
self._locationManager.desiredAccuracy= kCLLocationAccuracyBest;
self._locationManager.delegate= self;
[self._locationManagerstartUpdatingLocation];
}
三、更新定位
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
//在地图上加大头针
MKPointAnnotation*annotation = [[MKPointAnnotationalloc] init];
annotation.coordinate = newLocation.coordinate;
[self._mapView addAnnotation:annotation];//
[self._saveLocations addObject:annotation];
if(UIApplication.sharedApplication.applicationState== UIApplicationStateActive)
{
if(backgroundTask!= UIBackgroundTaskInvalid)//如果后台没有关闭,结束
{
[[UIApplicationsharedApplication] endBackgroundTask:backgroundTask];
backgroundTask= UIBackgroundTaskInvalid;
}
//显示所有的大头针
for (MKPointAnnotation *annotation in self._saveLocations)
{
CLLocationCoordinate2D coordinate = annotation.coordinate;
MKCoordinateRegionregion=MKCoordinateRegionMakeWithDistance(coordinate,storedLatitudeDelta,storedLongitudeDelta);
MKCoordinateRegion adjustedRegion = [_mapView regionThatFits:region];
[_mapView setRegion:adjustedRegion animated:NO];
}
}
else
{
NSLog(@"applicationD in Background,newLocation:%@", newLocation);
}
}
四、后台加入计时器
//用定时器控制后台运行定位时间
-(void)applicationDidEnterBackground:(NSNotificationCenter *)notication{
UIApplication* app = [UIApplicationsharedApplication];
backgroundTask= [app beginBackgroundTaskWithExpirationHandler:^{
NSLog(@"applicationD in Background");
}];
//加入定时器,用来控制后台运行时间
self._updateTimer= [NSTimerscheduledTimerWithTimeInterval:backgroundUpdateInterval
target:self
selector:@selector(stopUpdate)
userInfo:nil
repeats:YES];
[[NSRunLoopcurrentRunLoop] addTimer:self._updateTimerforMode:NSRunLoopCommonModes];
}
五、计时时间到,停止后台运行与定位
-(void)stopUpdate{
[self._locationManagerstopUpdatingLocation];
[self._updateTimerinvalidate];
self._updateTimer= nil;
if(backgroundTask!= UIBackgroundTaskInvalid)
{
[[UIApplicationsharedApplication] endBackgroundTask:backgroundTask];
backgroundTask= UIBackgroundTaskInvalid;
}
}
六、用模拟器测试方法
用模拟器测试的时候选择:调试-位置-后三者都行
然后在控制台就可以看到后台输出的信息了
1万+

被折叠的 条评论
为什么被折叠?



