1

因为我需要用户在后台的位置,并且我正在获取用户的位置didUpdateLocation。但正因为如此,它会消耗更多的电池。

我已经startMonitoringSignificantLocationChanges在后台方法中实现了,但据我说didUpdateLocation没有工作。

任何解决方案,这样我就可以消耗低电池电量并经常获取用户的更新位置。

4

1 回答 1

0

“didUpdateLocation 。但由于这个原因,它会消耗更多的电池。”

这并不完全正确。您可以使用 didUpdateLocation 调整所需的精度级别。根据您想要的精度,您的设备将仅使用蜂窝位置数据,而不是始终打开本机 GPS 接收器,例如:

更低的电池消耗和 500 米的精度
CLLocationAccuracy myaccuracy = 500.00;

您可以获得的最大精度和最大电池消耗(需要将设备插入充电器)
CLLocationAccuracy myaccuracy = -1.0;


如果您不确定要选择哪个值,也可以使用常量:

extern const CLLocationAccuracy kCLLocationAccuracyBestForNavigation; <-- 表示 -1.0
extern const CLLocationAccuracy kCLLocationAccuracyBest;
extern const CLLocationAccuracy kCLLocationAccuracyNearestTenMeters;
extern const CLLocationAccuracy kCLLocationAccuracyHundredMeters;
extern const CLLocationAccuracy kCLLocationAccuracyKilometer;
extern const CLLocationAccuracy kCLLocationAccuracyThreeKilometers;

https://developer.apple.com/library/mac/#documentation/CoreLocation/Reference/CoreLocationConstantsRef/Reference/reference.html#//apple_ref/c/data/kCLLocationAccuracyBest


现在回答你的问题:

didUpdateLocation 仅在您要求 locationManager 启动更新位置时才有效。

当您使用 startMonitoringSignificantLocationChanges 时,您不会从 GPS 单元获得任何信息。使用此方法时,一旦您的手机从一个基站切换到另一个基站(例如乘火车或汽车旅行),您的应用就会被唤醒。当你的应用被它唤醒时,你需要实现:

id locationValue = [launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey];
if (locationValue) {     
    NSLog(@"locationValue received, now needs to start updateLocation again");
    //your code goes here
}

在你的里面

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

}

然后,您可以再次启动常规 startUpdatingLocation 以接收 didUpdateLocation 通知。或者,您可以查看 Apple 的文档并查看启动选项是否在应用启动时携带任何位置信息。

于 2013-06-06T07:51:27.200 回答