我知道这是一个非常常见的问题。我已经阅读了很多答案,但没有找到适合我的答案。这就是为什么我发布这个问题,并希望有人会告诉我如何修复我的代码。
我有函数startUpdate来使用CLLocationManager更新位置。在applicationDidEnterBackground方法中,我写了类似下面的内容:
[self startUpdate]; // position1 的NSLog(@ “applicationDidEnterBackground”); __block UIBackgroundTaskIdentifier bgTask; bgTask = [application beginBackgroundTaskWithExpirationHandler:^ { [application endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; }];
[self startUpdate]; // position2 //启动长时间运行的任务并立即返回。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^ { [self startUpdate]; // position3 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@“http://google.com”]]; });
我试图将[self startUpdate]放在三个位置之一(position1,2,3),有时它可以工作,有时候不行,我不知道为什么。
如果它有效,更新只需在3分钟的事件中运行。如果我在应用程序处于前台时调用startUpdate,然后将应用程序置于后台,使用真实设备更新将持续15分钟,使用模拟器更新超过1小时(我不确切知道,1小时后,我认为它将永远持续我停止测试)。那么之间有什么不同:前景中的startupdate->在后台转到后台vs startupdate;模拟器与真实设备?
在position3之后,我打电话跟随线打开野生动物园 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@“http://google.com”]]; 但它不起作用。那么在后台可以执行哪些类型的任务?
我需要让服务永远运行。一些搜索结果表明这是不可能的。但是一些熟悉的应用程序做到了这一点(Facebook,...保持服务接收通知)。他们怎么能这样做?
非常感谢你,
答案 0 :(得分:1)
位置服务的确切行为已在Core Location文档的最新更新中阐明。它现在说明了 -
标准位置服务在应用程序正常时提供事件 在前台跑。当你的应用程序在后台时,这个 服务仅在位置更新后台模式时才传递事件 已启用该应用程序。此服务不会重新启动iOS应用程序 已被终止。
重要的地理位置变更服务正常地提供活动 应用程序正在前台或后台运行。对于终止 iOS应用程序,此服务重新启动应用程序以提供事件。用于 此服务需要用户“始终”授权。
因此,似乎为了在后台继续接收位置更新的最佳机会,一旦您转到后台状态,您应切换到重要的位置更改监控,并在返回前台后恢复完整位置监控。