您的位置:首页 > 移动开发 > IOS开发

iOS 后台持续定位

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

一、首先。在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;
    }
}

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


 

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


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: