【问题标题】:Reception of Low Power Mode disabled notification in iOS在 iOS 中接收低功耗模式禁用通知
【发布时间】:2018-05-16 12:36:24
【问题描述】:

我正在尝试遵循 iOS 能源指南并让我的应用了解低功耗模式;为此,我遵循here 发布的指南,该指南提供了有关如何订阅此类事件的代码。我已经实现了这个功能,如下所示:

  /// Function to subscribe to low-power mode events
  ///
  func subscribeToLowBatteryNotification() {
    NotificationCenter.default.addObserver(self,
                        selector: #selector(lowBatteryHandle),
                        name: Notification.Name.NSProcessInfoPowerStateDidChange,
                        object: nil)
  }

  /// handler for low-power mode events.
  ///
  @objc func lowBatteryHandle(_ notification: Notification) {
    let lowPowerModeEnabled = ProcessInfo.processInfo.isLowPowerModeEnabled

    if lowPowerModeEnabled {
      stopTrackingBackground()
    } else {
      startTrackingBackground()
    }
  }

这很简单。然后我将我的应用程序置于后台,同时根据需要不断跟踪位置;然后我启用低功耗模式和通知 确实收到(在后台)成功提示应用程序暂停跟踪。不幸的是,当禁用低功耗并且我希望收到一个类似的状态更改事件(在后台)时,这不会在后台收到,并且该事件仅在以下情况下传递给应用程序我再次进入应用程序。有谁知道如何在后台接收这些事件?

【问题讨论】:

    标签: ios background


    【解决方案1】:

    当您的应用停止后台跟踪时,系统会转到suspend the application。暂停时,您的应用将不会收到通知,即使是关于低功耗模式的状态。一种策略可能是转移到较低级别的位置传递频率,例如significant location changes,或者使用deferred location 更新可能适合或可能不适合您的用例。

    当用户全局或为您的应用禁用后台应用刷新设置时,重大更改位置服务不会重新启动您的应用。此外,当后台应用刷新关闭时,应用不会收到重大变化或区域监控事件,即使它处于前台也是如此。

    由于低功耗模式会全局禁用后台应用刷新,我认为这意味着可能不会传递重大更改事件。注释说“当 用户 禁用时”,但没有说明在低功耗模式下是主要操作还是次要操作。不过,Deferred location 将提供更新。

    Apple 在automatically pausing location updates 上的文档中提供了其他指导

    对于具有使用中授权的应用,暂停位置更新会终止对位置更改的访问,直到应用再次启动并能够重新启动这些更新。如果您不希望完全停止位置更新,请考虑禁用此属性并将位置精度更改为 kCLLocationAccuracyThreeKilometers 当您的应用程序移动到后台时。这样做可以让您继续以省电的方式接收位置更新。

    另外,在standard location service 的文档中,苹果提供了更多指导

    为了最大程度地降低功耗,切勿将 desiredAccuracy 属性设置为比您实际需要的精度更高的精度。同样,始终将 distanceFilter 属性设置为满足应用需求的最大值。系统总是尝试为您提供可用的最佳位置数据,但这些属性使系统可以灵活地在不需要时关闭硬件元素。

    所有这些信息都表明,要在启用低功耗模式时继续接收更新,您必须使用标准服务或延迟服务。为了在启用标准服务时保持电源友好,您可以通过调整 distanceFilterdesiredAccuracy 属性重新配置您的管理器以减少更新。

    【讨论】:

    • 您确定这些在低功耗模式下是允许的,并且最终不会杀死应用程序吗?
    • @jtimz 好点,与所有苹果文档一样,信息就在那里,但有时你必须追踪它。我用来自文档的更多证据更新了我的答案。
    • 感谢您的详尽回复;我已经用这些过滤器玩了很多次,但是当不处于低功耗模式时,我确实需要相当高的精度(在 100 米内)。另外我认为您需要重新启动位置跟踪管理器才能应用新设置;这样做我冒着杀死应用程序的风险,我错了吗?
    • 我认为如果您在通知处理程序中执行此操作,您将不会有风险。我假设通知处理程序在暂停应用程序之前全部完成。但我没有任何证据支持这一点。如果您还没有看到this,您可能还会发现它很有帮助。
    • 是的,我已经看到了这一点,但是在一些部署了我的应用程序的 iPhone 上,它会被暂停,并且从日志和用户告诉我的内容来看,它与低功耗模式的激活高度相关。此外,我想让应用程序在这种情况下表现得更好,但又不会冒着在此过程中杀死它的风险......但正如你所说,Apple 文档在这个主题上有点含糊——因此是这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    相关资源
    最近更新 更多