gpt4 book ai didi

ios - 何时调用 [clLocationManager stopUpdatingLocation]

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:16:23 24 4
gpt4 key购买 nike

为了在我的应用程序中节省电量,我决定在应用程序处于事件状态时混合使用 startUpdatingLocation 并在应用程序处于后台时进入 startMonitoringSignificantLocationChanges 模式。当应用程序进入后台时,我基本上会执行以下操作:

-(void)applicationDidEnterBackground:(UIApplication *)application{
[myLocationManager startMonitoringSignificantLocationChanges];
}

当应用程序返回前台时,我执行以下操作:

-(void)applicationDidBecomeActive:(UIApplication *)application{
//Other irrelevant code
[myLocationManager stopMonitoringSignificantLocationChanges];
[myLocationManager startUpdatingLocation];
}

无论如何,这对我来说似乎合乎逻辑。我的问题是,我应该在 applicationDidEnterBackground 事件中调用 stopUpdatingLocation 方法吗?像这样:

-(void)applicationDidEnterBackground:(UIApplication *)application{
[myLocationManager stopUpdatingLocation];
[myLocationManager startMonitoringSignificantLocationChanges];
}

我究竟应该在哪里调用 stopUpdatingLocation 方法?请告诉我是否有多个地方应该这样做。我假设任何错误事件都应该停止更新?

最佳答案

我看不出你的做法有什么问题。请注意,我有一个大量使用定位服务的商业应用程序,我正在重写它以提高它的性能并最​​大限度地减少电池使用量。

我发布的版本主要使用 sigLocationChanges(在后台和前台),但当我对 sigLocationChanges 给我的位置质量不满意时切换到使用 startUpdatingLocation,因为我的 UI 必须大致准确地显示用户位置。我在每次事件后立即调用 stopUpdatingLocation 以最大程度地减少电池消耗。在我的发布版本中,这似乎工作正常,但我的日志文件发现一小部分用户似乎经常定位不佳,而且我比我喜欢的更频繁地旋转 GPS 硬件。

此外,在隐私设置中,为您的应用显示的位置图标类型将取决于您上次使用完整 GPS 定位模式的时间。我的总是显示位置图标,表明电池电量耗尽,即使我每天只短暂使用 startUpdatingLocation 几次,这会让我的用户担心我的应用会如何影响他们的电池生命周期。

在我的新版本中,为了最大程度地减少使用 startUpdatingLocation 的电池消耗,我已将它的使用减少到希望为零。当应用程序激活时,我现在可以直接从位置管理器 cLLocMgr.location 获取当前位置。通常这是一个准确的位置,我的 UI 可以立即正确绘制(或刷新)。当某些 View 被激活时,我还会再次检查它,以确保用户在移动时保持我的应用程序打开,显示保持不变。现在,如果手机在应用程序中绝对需要良好位置的特定情况下位置不佳,我只会启动 GPS 硬件。在这种情况下,我将它的使用时间限制为 2 分钟(我假设 2 分钟足以从 GPS 硬件获得最佳位置),并等待至少 10 分钟,然后再允许它再次使用。

你的问题没有给我足够的信息来告诉我你需要多准确以及你的位置显示有多动态。但是除非您需要超高精度和动态显示,否则您应该考虑只使用当前位置而不启动 GPS 硬件以节省电池电量。

编辑:这是我用于 Jeraldo 的实际代码,经过一些清理。请注意,我已经一年没碰它了,所以我对它有点生疏,希望我没有清理任何东西。

 // Called at start to ask user to authorize location data access.
- (void) requestIOSLocationMonitoring {
#if TARGET_IPHONE_SIMULATOR
// If running in siumaltor turn on continuous updating (GPS mode)
// This is for testing as significant change isn't useful in simulator
// Set a movement threshold for new events. This is only used by continiuous mode, not sig change events
// Keep it as low as possible,but not so low as to generate spurious movements.
cLLocMgr.distanceFilter = 30;

// Use continuous location events in simulator.
// desired accuracy only works in continuious (high power) mode.
cLLocMgr.desiredAccuracy = kCLLocationAccuracyBest;
[cLLocMgr startUpdatingLocation];
#else
// If not in simulator app's default is significant change monitoring
[cLLocMgr startMonitoringSignificantLocationChanges];
#endif //TARGET_IPHONE_SIMULATOR
}

// Toggle back and forth between continius updates (GPS on) and
// significant change monitoring
- (void) setGPSMode: (bool) useGPSMode {
// Keep track of time since we last changed GPS mode
NSTimeInterval secsInThisMode = [[NSDate date] timeIntervalSinceDate: lastModeChange];

// inGPSMode is an object instance variable app uses to track mode it is in.
if (inGPSMode != useGPSMode) {
lastModeChange = [NSDate date];
if (!useGPSMode) {
// Tell app to operate as if continuous updating is off
inGPSMode = false;
#if TARGET_IPHONE_SIMULATOR
// But keep using continuous location events in simulator for testing.
cLLocMgr.distanceFilter = 30;
#else
// Turn off continious updates for app on actual devices
[cLLocMgr stopUpdatingLocation];
#endif
} else if (secsInThisMode > cMinGPSModeBreak) {
// Only turn on continuous updating again if it's been off long enough
// Prevents GPS mode from running continiously and killing battery life
inGPSMode = true;
cLLocMgr.desiredAccuracy = kCLLocationAccuracyBest;
cLLocMgr.distanceFilter = kCLDistanceFilterNone;
[cLLocMgr startUpdatingLocation];
}
}
}

关于ios - 何时调用 [clLocationManager stopUpdatingLocation],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14568453/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com