【发布时间】:2014-10-26 18:48:37
【问题描述】:
我知道这是一个非常常见的问题。我已经阅读了很多答案,但没有找到适合我的答案。这就是为什么我发布这个问题并希望有人能告诉我如何修复我的代码。
-
我有函数 startUpdate 使用 CLLocationManager 更新位置。在 applicationDidEnterBackground 方法中,我写了如下内容:
[自启动更新]; //位置1 NSLog(@"applicationDidEnterBackground"); __block UIBackgroundTaskIdentifier bgTask; bgTask = [应用程序 beginBackgroundTaskWithExpirationHandler:^{ [应用程序 endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; }];
[自启动更新]; //位置2 // 启动长时间运行的任务并立即返回。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [自启动更新]; // 位置 3 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://google.com"]]; });
我尝试将 [self startUpdate] 放在三个位置之一(位置 1、2、3),有时它有效,有时无效,我不知道为什么。
如果它有效,更新只需运行 3 分钟事件。如果我在应用程序处于前台时调用 startUpdate,然后将应用程序置于后台,使用真实设备更新将持续 15 分钟,使用模拟器会持续超过 1 小时(我不知道确切,1 小时后,我以为它会永远持续下去我停止测试)。那么有什么区别:前台启动更新->转到后台与后台启动更新;模拟器 vs 真机?
就在 position3 之后,我调用了以下行来打开 safari [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://google.com"]]; 但它不起作用。那么这里可以在后台执行哪些类型的任务呢?
我需要让服务永远运行。一些搜索结果表明这是不可能的。但是一些熟悉的应用程序做到了(Facebook,......保持服务接收通知)。他们怎么能这样做?
非常感谢,
【问题讨论】:
-
我会注意到 Facebook 不会让服务运行以接收通知。 Apple 处理此问题,然后使用 application:didReceiveRemoteNotification 向 AppDelegate 对象发送消息:
-
您是否只想在后台接收位置更新(并可能将其记录到服务器)?如果是这样,那么您需要做的就是在 Info.plist 中设置位置背景模式并告诉 CLLocationManager 开始更新。即使在后台,也会调用您的位置管理器委托方法。您无需担心长时间运行的任务。但是,您将无法从后台模式启动网站 - 您只能在前台执行此操作
-
@Paulw11:我已经在 Info.plist 中设置了位置背景模式。我问的是:在前台时,我开始更新位置然后进入后台模式,更新在 15 分钟内继续工作(使用真实设备,> 1h 使用模拟器);如果我在应用程序已经在后台时开始更新位置,更新只需 3 分钟。为什么他们如此不同?我怎样才能永远保持更新?
-
如果您指定了后台定位模式,那么定位更新将无限期地在后台继续进行。您无需为此设置后台任务。当连接到调试器(即模拟器或连接电缆的设备)时,后台任务的行为会有所不同,因为您的应用在后台时间到期后不会终止。
-
startUpdate是做什么的?它只是在 CLLocationManager 上调用startUpdatingLocation吗?你运行的是什么版本的 iOS?
标签: ios long-integer background-task