应用程序终止/挂起时的后台用户位置

26

我一直在尝试弄清楚如何在应用程序终止时获取用户的位置,就像应用程序Moves所做的那样。我知道的唯一方法是使用“显著位置更改”。但是,在进行显著位置更改时,应用程序只会在每500米之后醒来,而且只有在离上次更新已经过去约5分钟时才会醒来。

根据Apple的说法:

设备距其前一个通知移动500米或更多时,应用程序可以期望收到通知。 它不应该期望频率超过每5分钟一次的通知。 如果设备能够从网络中检索数据,则定位管理器更有可能及时传递通知。

在Moves应用程序中,即使应用程序被终止,它也能非常准确地检索到用户的位置,而且电池消耗很少。 它似乎也没有开启后台位置,因为它在电池使用列表中的原因只显示“后台活动”。 所以我想知道像Moves这样的应用程序是如何做到的。任何帮助都将是极好的!谢谢。

6个回答

4

您可以注册500米范围内的区域,并在其中注册通知区域通知。当它到达其中一个时,您的应用程序将在后台启动。然后,重新注册新的区域,保持该位置为中心。

enter image description here

来自苹果文档:

支持后台执行的应用程序可能会被系统重新启动以处理传入事件。如果应用程序由于用户强制退出以外的任何原因而终止,则系统将在发生以下任一事件时启动应用程序:

对于位置应用程序:

  • 系统接收到符合应用程序配置的交付标准的位置更新。

  • 设备进入或退出已注册区域。(区域可以是地理区域或 iBeacon 区域。)


3
如果您需要频繁更新位置信息但仍想节省电池寿命,请尝试以下方法:
  1. 添加在后台使用位置的必要权限。
  2. 使用 startUpdatingLocation 开始更新。
  3. 在后台使用 allowDeferredLocationUpdatesUntilTraveled:timeout: 开始延迟更新。在此方法中指定时间和距离过滤器。
  4. 确保您阅读了文档这里并正确指定所有属性以使其正常工作。

2
唯一的解决方案是使用CoreLocation的后台模式。如果您的应用程序需要iOS 8,则即使用户强制退出,系统也会重新启动您的应用程序。这在Apple Docs中有记录:
“在大多数情况下,系统不会在用户强制退出应用程序后重新启动应用程序。一个例外是位置应用,在iOS 8及更高版本中,用户强制退出后将被重新启动。在其他情况下,用户必须明确启动应用程序或重新启动设备,然后系统才能自动将其启动到后台。”

1

iOS 8中,我们需要注意一些新步骤才能使位置获取功能正常工作。第一步是将一个或两个键添加到项目的.plist文件中,具体取决于应用程序的主要功能。这两个键分别是NSLocationWhenInUseUsageDescription和NSLocationAlwaysUsageDescription,然后您需要添加一个字符串,向用户解释为什么应用程序需要访问他的位置,例如“此应用程序在前台/后台使用位置信息,因为A、B和C”。每个字符串都有相应的授权方法需要调用,即WhenInUse或Alway(即后台)。

- (void)startStandardUpdates
{
    // Create the location manager if this object does not
    // already have one.
    if (nil == locationManager)
        locationManager = [[CLLocationManager alloc] init];

    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;

    // Set a movement threshold for new events.
    locationManager.distanceFilter = 500; // meters

    [locationManager startUpdatingLocation];
}

0

来自文档

Tracking the User’s Location

There are several ways to track the user’s location in the background, most of which do not actually require your app to run continuously in the background:

The significant-change location service (Recommended)

Foreground-only location services

Background location services

后台执行

而且关于细节 - 获取用户位置


这并没有解释“Moves”应用程序如何在应用程序被关闭时仍能非常精确地跟踪用户的位置。 - gibo
被杀死是指用户手动终止进程?除了访问手机的位置数据文件并查找时间戳(非越狱系统可能无法获取此信息),该进程本身无法监控位置。 - some_id
应用程序“Moves”可以做到。 - gibo

0
从我的经验来看,您有三个选项可以使这项工作正常运行。第一个选项是使用静默通知,这需要后端进行一些努力。静默通知是某种推送通知,但它会在没有警报的情况下通知您的应用程序。第二个解决方案是后台获取。后台获取不需要后端解决方案,但遗憾的是您无法控制实例化所需的间隔。第三个选项是定期本地通知,没有消息。

啊,我以为Moves正在进行一些静默通知,所以我关闭了应用程序的通知,但它仍然能够相当准确地获取我一天中的位置信息,即使应用程序已经被终止。关闭通知会阻止静默或空通知的发生吗? - Zack
我不确定。你试过使用 kCLLocationAccuracyBestForNavigation 吗? - Ashraf Tawfeeq
当一个应用程序从应用切换器中被杀死时,是否可以使用静默通知重新启动应用程序? - Rajan Maheshwari
2
如果一个应用程序被杀死,你无法使用静默通知唤醒它。 - gibo
如果应用程序被终止,您可以使用静默通知将其唤醒,前提是它已经有一个延迟位置更新待处理 :) - amar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接