【问题标题】:Background user location when app is terminated/suspended应用程序终止/暂停时的后台用户位置
【发布时间】:2015-05-01 16:32:42
【问题描述】:

我一直在尝试弄清楚如何在应用程序终止时获取用户的位置,就像应用程序 Moves 的方式一样。我知道这样做的唯一方法是显着位置变化。但是,由于位置发生重大变化,该应用程序仅每 500 米才会被唤醒,并且只有在上次更新后大约 5 分钟时才会被唤醒。

根据苹果:

只要设备从之前的通知移动 500 米或更远,应用程序就会收到通知。它不应期望通知的频率超过每五分钟一次。如果设备能够从网络中检索数据,则位置管理器更有可能及时发送通知。

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

【问题讨论】:

    标签: ios objective-c cllocationmanager


    【解决方案1】:

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

    来自Apple's Documentation

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

    对于定位应用:

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

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

    【讨论】:

      【解决方案2】:

      如果您需要频繁更新位置信息,但仍想节省电池寿命,请试试这个 -

      1. 添加在后台使用位置所需的权限。
      2. 使用startUpdatingLocation 开始更新
      3. 在后台使用allowDeferredLocationUpdatesUntilTraveled:timeout: 开始延迟更新在此方法中指定时间和距离过滤器。
      4. 确保您阅读了文档 here 并正确指定所有属性以使其正常工作。

      【讨论】:

        【解决方案3】:

        唯一的解决方案是对 CoreLocation 使用后台模式。如果您的应用需要 iOS 8,即使用户强制退出,系统也会重新启动您的应用。这记录在Apple Docs:

        在大多数情况下,系统在应用程序被强制后不会重新启动它们 由用户退出。一个例外是位置应用程序,它在 iOS 8 和 后来被用户强制退出后重新启动。其他 但是,在某些情况下,用户必须明确启动应用程序或重新启动 应用程序可以在设备启动前自动进入 系统后台。

        【讨论】:

          【解决方案4】:

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

          - (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];
          }
          

          【讨论】:

            【解决方案5】:

            根据我目前的经验,您有 3 个选项可以完成这项工作。第一个是有一个静默通知,这需要后端完成。静默通知是某种推送通知,但它会在没有警报的情况下通知您的应用程序。第二种解决方案是后台提取。后台获取不需要后端解决方案,但遗憾的是您无法控制实例化它所需的时间间隔。第三个是没有消息的预定本地通知。

            【讨论】:

            • 啊,我假设 Moves 正在执行一些静默通知,所以我关闭了应用程序的通知,它仍然能够非常准确地检索我一整天都在哪里,但它被终止了。关闭通知是否会防止出现静音或空通知?
            • 嗯,我不确定。你试过kCLLocationAccuracyBestForNavigation吗?
            • 当应用程序从应用程序切换器中被终止时.. 是否可以使用静默通知重新启动应用程序...
            • 如果应用程序被杀死,您无法使用静默通知唤醒​​它
            • 如果应用程序被终止,您可以使用静默通知将其唤醒,前提是它已经有一个延迟的位置更新待处理:)
            【解决方案6】:

            来自文档

            跟踪用户的位置

            有几种方法可以在后台跟踪用户的位置, 其中大多数实际上并不需要您的应用程序在 背景:

            The significant-change location service (Recommended)
            
            Foreground-only location services
            
            Background location services
            

            Background Execution

            详情-Getting the User’s Location

            【讨论】:

            • 这并没有解释“moves”应用程序如何能够非常准确地跟踪用户位置,即使应用程序被杀死。
            • 在用户手动终止的过程中被杀死?除了访问手机位置数据文件并查找时间戳(怀疑这在非越狱系统上可用)之外,该过程无法监控位置本身。
            • “Moves”应用程序做到了。
            猜你喜欢
            • 1970-01-01
            • 2011-08-14
            • 1970-01-01
            • 2014-09-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-01-15
            • 1970-01-01
            相关资源
            最近更新 更多