- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
为了在我的应用程序中节省电量,我决定在应用程序处于事件状态时混合使用 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/
我正在处理 CLLocationManager。我的应用程序正在注册后台“应用程序注册位置更新”。但是当我调用“stopUpdatingLocation”并转到后台时,我的应用程序不再运行(我的应用程
即使我在我的位置管理器上调用了 stopUpdatingLocation,位置管理器图标仍然位于我的 iPhone 的右上角。为什么还没有停止? 最佳答案 即使在调用 stopUpdatingLoca
为了在我的应用程序中节省电量,我决定在应用程序处于事件状态时混合使用 startUpdatingLocation 并在应用程序处于后台时进入 startMonitoringSignificantLoc
当我的应用移至后台时,我调用了以下代码 - [m_coreLocationMan stopUpdatingLocation]; 但是,紫色三角形仍然存在。我是否还需要做其他事情才能成功? 最佳答案 这
我在 CLLocationManager 上调用 startUpdatingLocation(),在 didUpdateLocations 方法中我调用 stopUpdatingLocation()
我在做 map 应用, 我正在尝试使用 [locationManager stopUpdatingLocation]; 方法来停止位置服务。 在iOS4.3上好像还可以,在iOS5上就不行了。 请有人
我不明白为什么调用 stopUpdatingLocation 后灰色 gps 箭头不会消失。这是我的代码: - (void)viewDidLoad { [super viewDidLoad];
问题:我似乎无法阻止 Core Location 向我的应用/跟踪发送更新。 我在做什么:在我的 viewWillAppear 中,我调用了 self.locationManager 并将其传递给一个
我想验证如果我在 CLLocationManager 实例上调用 startMonitoringSignificantLocationChanges 然后调用 stopUpdatingLocation
这是我的场景。在我的应用程序中,不需要持续监控用户位置,但我需要位置尽可能准确。所以我只是调用 CLLocationManager startUpdatingLocation 并将 kCLLocati
我尝试了很多方法来停止我的应用程序的位置更新,但似乎没有任何效果...... 我做什么(关于帖子:StopUpdatingLocation method not working for iOS5):
我有一个 View 有一个 map View 的 subview 。我使用 CLLocationManager 获取当前位置并显示在 map 上。然后当 View 即将关闭时,我执行以下操作 _map
有谁知道为什么某些捆绑标识符与其他捆绑标识符的位置指示器保持不变?我正在使用安装在运行版本 5.0.1 的 iOS 设备上的 Apple 示例 LocateMe 应用程序。当我使用旧的包标识符时,在调
我想知道当 stopUpdatingLocation 被调用或必须一直调用方法 startUpdatingLocation 才能调用它们? 另一件事是开始区域监控的最佳位置 最佳答案 如果您的应用进入
我是一名优秀的程序员,十分优秀!