0

我知道这是一个很常见的问题。我已经阅读了很多答案,但没有找到适合我的答案。这就是为什么我发布这个问题并希望有人能告诉我如何修复我的代码。

  1. 我有函数 startUpdate 使用 CLLocationManager 更新位置。在 applicationDidEnterBackground 方法中,我写了如下内容:

    [自启动更新]; // position1 NSLog(@"applicationDidEnterBackground"); __block UIBackgroundTaskIdentifier bgTask; bgTask = [应用程序 beginBackgroundTaskWithExpirationHandler:^{ [应用程序 endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; }];

    [自启动更新]; // 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] 放在三个位置之一(位置 1、2、3),有时它可以工作,有时不能,我不知道为什么。

    • 如果它有效,更新只需在 3 分钟事件中运行。如果我在应用程序处于前台时调用 startUpdate,然后将应用程序置于后台,使用真实设备更新将持续 15 分钟,使用模拟器会持续超过 1 小时(我不知道确切,1 小时后,我以为它会永远持续下去我停止测试)。那么有什么区别:前台启动更新->转到后台与后台启动更新;模拟器VS真机?

    • 在 position3 之后,我调用以下行来打开 safari [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@" http://google.com "]]; 但它不起作用。那么可以在后台执行哪些类型的任务呢?

  2. 我需要让服务永远运行。一些搜索结果表明这是不可能的。但是一些熟悉的应用程序做到了(Facebook,......保持服务接收通知)。他们怎么能这样做?

太感谢了,

4

1 回答 1

1

定位服务的确切行为已在 Core Location 文档的最新更新中阐明。它现在指出 -

  • 当应用程序在前台运行时,标准位置服务会正常传递事件。当您的应用程序处于后台时,此服务仅在为应用程序启用位置更新后台模式时才会传递事件。此服务不会重新启动已终止的 iOS 应用程序。

  • 当应用程序在前台或后台运行时,重要的位置更改服务通常会传递事件。对于终止的 iOS 应用程序,此服务会重新启动应用程序以传递事件。使用此服务需要用户“始终”授权。

因此,为了在后台继续接收位置更新的最佳机会,您应该在移动到后台状态后切换到显着的位置更改监控,并在返回前台后恢复完整的位置监控。

于 2014-09-03T07:20:22.757 回答