我知道这是一个很常见的问题。我已经阅读了很多答案,但没有找到适合我的答案。这就是为什么我发布这个问题并希望有人能告诉我如何修复我的代码。
我有函数 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 "]]; 但它不起作用。那么可以在后台执行哪些类型的任务呢?
我需要让服务永远运行。一些搜索结果表明这是不可能的。但是一些熟悉的应用程序做到了(Facebook,......保持服务接收通知)。他们怎么能这样做?
太感谢了,