我需要在应用程序转到后台时继续获取用户的位置更新,并且正如我在Apple的文档中发现的那样,这是允许执行的长时间运行的后台任务之一。我还需要进行一些处理和网络调用,以便在通知位置更新时向服务器发送一些信息。我正在试图做的,在广招,是这样的:了解iOS中用户位置的后台跟踪
- (void)applicationDidEnterBackground:(UIApplication *)application
{
bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
// Background task
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"Background time remaining: %f seconds (%d mins)",
[[UIApplication sharedApplication] backgroundTimeRemaining],
(int)([[UIApplication sharedApplication] backgroundTimeRemaining]/60));
// Need to get data from database here
// Finished
if (bgTask != UIBackgroundTaskInvalid) {
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}
});
// Start location manager
locationManager = [[CLLocationManager alloc] init];
if ([CLLocationManager locationServicesEnabled]) {
locationManager.delegate = self;
locationManager.distanceFilter = 20;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[locationManager startUpdatingLocation];
}
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[[UIApplication sharedApplication] endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Want to perform some data processing here, including concurrent tasks
// and several network calls to get and send data to server
[self locationProcessingCompleted];
});
}
- (void)locationProcessingCompleted
{
// Check results. If needed, some more data processing and several network
// calls to send data to server
// Close background task
if (bgTask != UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}
}
我不`吨找到关于位置的服务的长期运行的后台任务的任何代码示例,我有一些关于它的几个问题:
一)是否有必要到dispatch_async
队列中执行所有的后台代码?换句话说,applicationDidEnterBackground:
中的所有代码都是异步执行的,包括位置管理器设置?
b)[[UIApplication sharedApplication] backgroundTimeRemaining]
正在返回非常长的值。这次不应该在10分钟左右?
c)我想要做的是:执行初始有限长任务,开始位置更新,然后每次触发didUpdateToLocation:
时执行一些其他有限长度的任务。我在Info.plist
中设置了location
的值UIBackgroundModes
。我的方法是否正确?我是否会无限期地更新位置,然后在每次更新时,我可以执行长度不超过10分钟的有限长度任务吗?
请帮我解决这个问题。在此先感谢
+1这是一个解决方案在iOS 6! – 2013-08-21 12:53:20
这并没有解决原来的海报问题。设置UIBackgroundModes可以获得更新,但它不会让您有足够的处理时间来实际建立网络连接并进行实际工作。即使您在位置处理方法中创建了后台任务,backgroundTimeRemaining仍然是一个巨大的数字,表明它尚未设置。我的经验是我的后台操作在几秒钟内就被杀死了。 – 2013-10-01 23:18:45
对不起,我不同意,我的一个应用程序在App Store上运行,它在后台位置更新(网络访问,数据操作和发送本地通知等)的基础上做了很多事情。我猜(可能是错误的)你的评论是基于假设/知识而不是这种特殊情况的经验,或者如果在类似情况下进行处理时遇到问题,你可能做错了什么。 – Zee 2013-10-02 12:39:02