我需要不断获取用户的位置更新应用程序时,将背景和,我苹果的文档中找到,这是被允许执行长期运行的后台任务之一。 我还需要作一些处理和网络通话时的位置更新通知发送给服务器的一些信息。 我正在试图做的,在广招,是这样的:
- (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;
}
}
我不`吨找到有关位置的服务的长期运行的后台任务的任何代码示例,我对它有几个问题:
a)是否有必要到内执行所有的后台代码dispatch_async
队列? 换句话说,已经全部代码applicationDidEnterBackground:
异步执行,包括位置管理器设置?
二[[UIApplication sharedApplication] backgroundTimeRemaining]
返回一个非常长的值。 这个时间不应该是大约10分钟?
C)我想做的事:执行初始长度有限的任务,启动位置更新,然后执行一些其他有限长度的任务,每一个时间didUpdateToLocation:
被触发。 我已经设置了location
的值UIBackgroundModes
在Info.plist
。 是我的方法正确吗? 我将继续无限期地更新位置,然后我可以在每一次更新不到10分钟长进行有限长度的任务接收到?
拜托,我需要这个问题有所帮助。 提前致谢