2

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

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

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

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

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

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

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

4

1 回答 1

2

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

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

同样在隐私设置中,为您的应用显示的位置图标类型将取决于您上次使用完整 GPS 定位模式的时间。我的总是显示位置图标,表示对电池的影响很大,即使我每天只短暂使用 startUpdatingLocation 几次,这会使我的用户对我的应用程序如何影响他们的电池寿命感到偏执。

在我的新版本中,为了最大程度地减少使用 startUpdatingLocation 的电池消耗,我将它的使用减少到希望为零。当应用程序激活时,我现在直接从位置管理器 cLLocMgr.location 获取当前位置。通常这是一个准确的位置,我的 UI 可以立即正确绘制(或刷新)。当某些视图被激活时,我还会再次检查它,以确保用户在保持我的应用打开的同时是否在移动,显示器跟上。现在,我只在手机在应用程序中绝对需要一个好位置的特定情况下,如果手机的位置不好,我就会启动 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];
        }
    }
}
于 2013-02-15T19:04:34.807 回答