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

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

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

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

【问题讨论】:

    标签: ios iphone geolocation cllocationmanager clregion


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2016-03-15
      • 1970-01-01
      • 2022-01-01
      • 2012-12-22
      • 2019-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多