iOS 后台持续定位

项目需要,加了长时间后台定位(计时器控制后台运行时间),现在把代码发给大家哈
本人只测试了定时一小时控制后台获取位置信息,肯定可以更长时间的运行,不过耗电那是当然的了,所以做类似软件一定要先提醒用户,避免被拒和被用户差评!




一、首先。在Info.plist里面添加Key:Required background modes 
Value:App registers for location updates








二、初始化



#define RUNTIME 60*60//当然是控制在一小时以内


- (void)viewDidLoad
{
[superviewDidLoad];
    [self initData];

//响应后台
[[NSNotificationCenterdefaultCenteraddObserver:selfselector:@selector(applicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotificationobject:nil];
}






//初始化数据
-(void)initData{
backgroundUpdateIntervalRUNTIME;//设置计时器时间


    self._saveLocations = [[NSMutableArray allocinit];
self._locationManager= [[CLLocationManagerallocinit];
self._locationManager.desiredAccuracykCLLocationAccuracyBest;
self._locationManager.delegateself;
[self._locationManagerstartUpdatingLocation];

}








三、更新定位
- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation
{
//在地图上加大头针
MKPointAnnotation*annotation = [[MKPointAnnotationallocinit];
    annotation.coordinate = newLocation.coordinate;
    [self._mapView addAnnotation:annotation];//
    [self._saveLocations addObject:annotation];


if(UIApplication.sharedApplication.applicationState== UIApplicationStateActive)
    {
if(backgroundTask!= UIBackgroundTaskInvalid)//如果后台没有关闭,结束
        {
[[UIApplicationsharedApplicationendBackgroundTask:backgroundTask];
backgroundTaskUIBackgroundTaskInvalid;
        }


//显示所有的大头针
        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];
[[NSRunLoopcurrentRunLoopaddTimer:self._updateTimerforMode:NSRunLoopCommonModes];
}








五、计时时间到,停止后台运行与定位
-(void)stopUpdate{
[self._locationManagerstopUpdatingLocation];


[self._updateTimerinvalidate];
self._updateTimernil;
if(backgroundTask!= UIBackgroundTaskInvalid)
    {
[[UIApplicationsharedApplicationendBackgroundTask:backgroundTask];
backgroundTaskUIBackgroundTaskInvalid;
    }
}












六、用模拟器测试方法
用模拟器测试的时候选择:调试-位置-后三者都行

 



然后在控制台就可以看到后台输出的信息了

 










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值