gpt4 book ai didi

ios - 我可以在后台使用 startupdatinglocation 吗?

转载 作者:行者123 更新时间:2023-11-28 22:33:58 25 4
gpt4 key购买 nike

我需要知道我是否靠近我的应用程序中保存的地理位置,范围从10 米500 米 在后台。我使用了 startMonitoringForSignificantLocationChange 但我没有得到准确的结果。相反,使用 startupdatinglocation 给出的结果与 7 米 一样准确。我计划添加一个 NSTimer 以每 1 分钟 调用一次 startupdatinglocation

还有其他解决办法吗?

最佳答案

首先,请不要每分钟都调用 startUpdatingLocation。您将杀死用户设备上的电池生命周期。位置服务使用大量电池电量来运行。此外,一旦您调用 startUpdatingLocation,它将一直运行,直到您调用 stopUpdatingLocation

您可以在 CLLocationManager 上设置一些属性,以根据您的需要对其进行配置。喜欢...

@property(assign, nonatomic) CLLocationDistance distanceFilter
@property(assign, nonatomic) CLLocationAccuracy desiredAccuracy

distanceFilter 描述:在生成更新事件之前设备必须水平移动的最小距离(以米为单位)。

desiredAccuracy 可以是以下之一:

kCLLocationAccuracyBestForNavigation
kCLLocationAccuracyBest;
kCLLocationAccuracyNearestTenMeters;
kCLLocationAccuracyHundredMeters;
kCLLocationAccuracyKilometer;
kCLLocationAccuracyThreeKilometers;

根据您的 CLLocationManager 对象的配置,设备将使用特定的地理位置硬件与其他硬件。有时简单地使用手机信号塔三角测量就足够了,并且是获得半准确位置的最快方法。其他时候它可能需要使用 GPS,这会很快耗尽电池生命周期并且需要更长的时间才能到达某个位置,但在大多数情况下更准确。

我建议启动一个 NSTimer,但将其用于与您计划相反的用途。如果 CLLocationManager 无法获得足够准确的位置,请在一段合理的时间后将其用于 stopUpdatingLocation。您不想让位置服务永远运行。将此计时器设置为大约 30 秒将确保它在超时后关闭。

此外,您还需要实现 CLLocationManagerDelegate 方法:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation

在此方法中,您需要检查位置的时间戳 以确保它是最近的。您还需要检查位置的 horizo​​ntalAccuracy 以确保它在所需的精度范围内。这是如何执行此操作的示例...

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {

// Ensure we get a recent and accurate location
NSDate * locationTimestamp = [newLocation timestamp];
NSTimeInterval timeDifference = [locationTimestamp timeIntervalSinceNow];
double thirtyMins = (30 * 60 * -1);
BOOL locationTimestampIsCurrent = (timeDifference > thirtyMins);
BOOL isAccurateLocation = (newLocation.horizontalAccuracy <= 3000.00);

if (locationTimestampIsCurrent && isAccurateLocation) {
NSLog(@"Shutting down location services, we have a good locaton.");
[self stopListeningForLocation];
} else {
// Do nothing, let this method be called again with a new "newLocation" to check its validity.
}
}

从 iOS 6 开始,上述方法已被弃用,而是使用以下委托(delegate)方法:

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations

要获取最新的位置,只需像这样获取位置数组的最后一个对象:

  CLLocation *location = [locations lastObject];

关于ios - 我可以在后台使用 startupdatinglocation 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16650462/

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