在后台运行 CLLocationManager 可以吗

Posted

技术标签:

【中文标题】在后台运行 CLLocationManager 可以吗【英文标题】:Is it ok to run CLLocationManager in background 【发布时间】:2014-04-01 03:53:10 【问题描述】:

我想在用户每移动 20 米时检查用户当前位置。全部处于活动状态和后台。我知道在活动状态下可以这样做。但我想知道在活动状态下做同样的事情是否可以ios中的后台模式。特别想知道苹果拒绝这种方法。但是在ios7中我认为它还可以

其实我想得到醋栗的位置,如果用户移动超过 1km 调用服务 API,如果用户移动每 20m 检查本地数据库会弹出一些数据。

我只想在活动状态和背景状态下都这样做。 目前我正在使用显着的位置变化和区域监控。但是区域监控的准确性较低。我想要至少 20m 的准确性。 这就是为什么我尝试使用上述方法的原因。我知道这种方法会消耗大量电池。但我想要最好的准确性。 任何人都有想法。

【问题讨论】:

【参考方案1】:

您可以获取用户当前位置,活动状态和后台状态应用都不会被拒绝。 在 plist 中,您需要设置在后台状态下获取用户位置的请求。设置好后,您的位置管理器代表将继续调用(因此有很多机会很快耗尽电池电量)在一个类/应用程序代理中编写您的位置管理器方法并重用它们,以便您可以轻松检查条件(当每当用户移动它会自动更新用户的位置,这样你就可以检查两点之间的距离,如果用户达到膨胀,那么你可以提示警报)

希望这会有所帮助..

【讨论】:

目前我使用单例类作为位置管理器。当用户启动更新位置管理器时。它应该每天都在后台状态下工作。不能停止它。我想问的一件事。我能改变期望的准确度吗设置委托后。因为有时位置更新距离可能会改变。然后我可以从中节省能量。我的大问题是电池。另一件事我听说有时位置管理器会在后台模式下自动暂停 一旦我们在 Plist 位置管理器中设置了对位置管理器的请求,将不会在后台模式下自动暂停。(我将它用于我的一个应用程序)。正如你所说,你在这里使用单例类作为位置管理器,位置将更新没有问题。如果您想更改 desiredAccuracy ,请将其保存在共享位置,您可以从应用程序的任何部分访问和设置值,因此一旦您更改了某些位置,它将在单例类中自动更新。 好的,谢谢电池,它的呼叫位置管理器每 20 米用户移动一次 在 1 分钟调用 [locationManager StartUpdating] 后使用计时器;然后检查距离,然后再次停止位置管理器,我们可以这样做,但主要问题是无法确定在 1 分钟内用户可以行驶多于/少于 20 米(乘汽车/步行)。这是有风险的计算。我不确定在后台状态下使用位置管理器时是否可以节省电池。我会尝试,如果我找到解决方案,我会告诉你 将desiredAccuracy设置为20m然后位置管理器会自动每20米检查一次【参考方案2】:

在 AppDelegate.m 文件中

- (void)applicationDidEnterBackground:(UIApplication *)application
    UIApplication* app = [UIApplication sharedApplication];
   UIApplication *bgTask = [app beginBackgroundTaskWithExpirationHandler:^
        [app endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    ];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
        NSTimer* t = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(al) userInfo:nil repeats:NO];
        [[NSRunLoop currentRunLoop] addTimer:t forMode:NSDefaultRunLoopMode];
        [[NSRunLoop currentRunLoop] run];
    );

-(void)al
    yourViewController *navigation=[[yourViewController alloc]initWithNibName:@"yourViewController" bundle:nil];
    [navigation.locationManager startMonitoringSignificantLocationChanges];

也可以试试下面的链接: here

【讨论】:

以上是关于在后台运行 CLLocationManager 可以吗的主要内容,如果未能解决你的问题,请参考以下文章

如何在特定时间段内运行 CLLocationManager

当 iphone 在后台时使用 CLLocationManager 将位置发送到服务器

应用在后台时启动 CLLocationManager 位置更新

后台持续定位CLLocationManager详解

iOS后台定位

应用程序再次激活时 CLLocationManager 的奇怪行为