【问题标题】:iOS: How to reduce background activity in drive tracking appiOS:如何减少驾驶跟踪应用程序中的后台活动
【发布时间】:2016-09-06 10:04:19
【问题描述】:

我有一个在后台运行并监控用户驱动器的应用程序。

由于 CLLocation 后台模式,应用程序在后台保持活动状态。

但问题是应用程序在过去 24 小时内将后台活动显示为 22 小时。我的理解是后台活动会消耗大量电量。

有些驾驶跟踪应用的后台活动大约等于所有驾驶时间的总和。我的应用消耗的电量是它们的 3 倍。

如何检测所有用户驱动器,同时减少后台活动,从而减少电池消耗?

【问题讨论】:

    标签: ios background core-location cllocationmanager


    【解决方案1】:

    每当 CLLocationManager 的 didUpdateLocation 委托触发 CLLocationManager 触发委托的频率时,您的应用程序就会变为活动状态,具体取决于您在 CLLocationManager 配置中指定的准确性。

    - (CLLocationManager *)defaultLocationManager {
        static dispatch_once_t pred = 0;
        static CLLocationManager *locationManager = nil;
        dispatch_once(&pred, ^{
            locationManager = [[CLLocationManager alloc] init];
            locationManager.delegate = self;
            locationManager.desiredAccuracy=kCLLocationAccuracyThreeKilometers; //try setting accuracy filter to a value where it wont end up calling your delegate frequently yet gives you enough info about user location as per your need
            locationManager.distanceFilter=3000; //try setting distance filter to a value where it wont end up calling your delegate frequently yet gives you enough info about user location as per your need
            [locationManager requestAlwaysAuthorization];
        });
        return locationManager;
    }
    

    使用后台模式特别是位置更新时要小心。如果您将位置更新用于跟踪用户位置以外的任何其他目的,Apple 很可能会拒绝您的应用。

    Apple 希望您在应用说明中添加明确说明继续使用 GPS 会耗尽电池电量的声明。

    大多数情况下,应用不需要实时位置更新。如果您的情况就是这样,但您想跟踪用户位置,请删除位置更新的后台模式并尝试使用significantLocationChanges

    [[self defaultLocationManager] startMonitoringSignificantLocationChanges];
    

    注意:要观察重要位置变化,您不需要后台模式功能,即使您的应用处于后台,您也将继续获得控制权,就像实时位置更新一样。

    准确性较低,功耗较低,应用程序调用较少:)

    希望我的回答对你有帮助:)

    【讨论】:

    • 您的回答很有帮助。我的应用程序会跟踪用户,因此位置权限不是问题。但我想每 1 分钟获取一次用户位置。在节省电池寿命的同时如何做到这一点。我的应用只需要早上 1 小时和晚上 1 小时的用户位置。
    • 首先,定位服务不是为时间间隔而设计的。托管管理器仅在 iPhone 更改其位置时触发位置更新。这在所有可能的方面都是有意义的,因为如果你把你的 iPhone 放在桌子上 1 小时,它的位置总是一样的,相信你的桌子是静止的:p 那么为什么要浪费时间触发 60 次你的应用程序烧掉电池呢? ??您能否澄清一下为什么每分钟后都需要位置更新?为什么您不能在位置过​​滤器上中继???我相信如果您仅将位置更新用于跟踪用户
    • 那么距离过滤器必须完成非常公平的工作。尝试将距离过滤器设置为您需要的准确距离,将准确度级别设置为最准确的距离,您必须做好准备 :) 如果您只开始后台活动 2 小时,那么您是如何注意到它的22小时活跃???这意味着您要么开始并且根本没有停止它:) 我的建议,因为您不能使用过期处理程序或 nstimer,因为应用程序可能会在两次位置更新之间暂停,在这种情况下您的计时器也可能停止,因此请将当前时间保存在
    • NSUserdefaults 和每次获取位置更新时检查持续时间是否小于一个小时,如果是,则进程停止监视位置更改:) 这将确保您的后台活动不会运行超过一个小时: )但是如果用户在您的应用程序处于后台时手动更改时间,那么您的逻辑将被搞砸:(但我相信这是您可以做的最好的事情,因为您可以在后台连续运行计时器:) 希望我的建议有道理:)
    猜你喜欢
    • 2021-12-04
    • 2016-04-07
    • 1970-01-01
    • 2023-03-10
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 2012-07-09
    相关资源
    最近更新 更多