gpt4 book ai didi

ios - CLLocationManager 的 didExitRegion 永远不会被调用

转载 作者:可可西里 更新时间:2023-11-01 05:56:39 24 4
gpt4 key购买 nike

我正在尝试设置一个小型地理围栏(100 米),以便在用户离开家时提醒他们。为此,我像这样请求用户当前位置:

- (void)requestUsersCurrentLocation
{
if (self.locationManager == nil) self.locationManager = [[CLLocationManager alloc] init];

self.locationManager.delegate = self;
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
self.locationManager.distanceFilter = 100;
[self.locationManager startUpdatingLocation];
}

我使用 CLLocationManager 的委托(delegate)方法检查应用程序是否能够确定用户的当前位置。在我的测试中,这工作正常并且应用程序继续调用我的 attemptToRegisterGeofenceAlertForLocation: 方法

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
CLLocation *location = [locations lastObject];
NSDate *eventDate = location.timestamp;
NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];
if (abs(howRecent) < 15.0)
{
[self.locationManager stopUpdatingLocation];

if([self attemptToRegisterGeofenceAlertForLocation:location])
{
[[NSNotificationCenter defaultCenter] postNotificationName:kGeofenceSetupSuccess object:nil];
}
else
{
[[NSNotificationCenter defaultCenter] postNotificationName:kGeofenceSetupFailure object:nil];
}
}
}

到目前为止一切顺利。这是我的自定义函数,用于在用户当前位置周围注册一个相对较小的地理围栏:

- (BOOL)attemptToRegisterGeofenceAlertForLocation:(CLLocation *)location
{
// Do not create regions if support is unavailable or disabled
if (![CLLocationManager regionMonitoringAvailable]) return NO;

// Check the authorization status
if (([CLLocationManager authorizationStatus] != kCLAuthorizationStatusAuthorized) && ([CLLocationManager authorizationStatus] != kCLAuthorizationStatusNotDetermined)) return NO;

// Clear out any old regions to prevent buildup.
if ([self.locationManager.monitoredRegions count] > 0)
{
for (id obj in self.locationManager.monitoredRegions)
{
[self.locationManager stopMonitoringForRegion:obj];
}
}

// If the overlay's radius is too large, registration fails automatically,
// so clamp the radius to the max value.
CLLocationDegrees radius = 100; // meters?
if (radius > self.locationManager.maximumRegionMonitoringDistance)
{
radius = self.locationManager.maximumRegionMonitoringDistance;
}

// Create the region to be monitored.
CLRegion *region = [[CLRegion alloc] initCircularRegionWithCenter:location.coordinate radius:radius identifier:kGeofenceIdentifier];
[self.locationManager startMonitoringForRegion:region];

return YES;
}

当用户退出地理围栏区域时,我会这样回应:

- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
{
if([region.identifier isEqual:kGeofenceIdentifier])
{
if([[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground)
{
// Fire a UILocationNotification
}
else
{
// Fire a UIAlertView
}
}
}

我已确定该应用程序能够获取用户位置并且地理围栏已正确注册,但我无法在实际设备(支持 3G 的 iPhone)上触发它。我离开了地理围栏区域并行驶了几英里而没有收到任何通知。通过彻底改变我的位置,我已成功地在模拟器中收到警报。

我做错了什么?

最佳答案

您的半径似乎设置为 100M(很好)。距离过滤器也设置为 100M,这可能只是对你不利。在模拟器中,您会获得非常精确的更新,因为您必须传入它们。在现实世界的测试中,您从 Wifi 近似和小区三角测量中获得的坐标不够精确。

我的经验是,如果我使用 kCLLocationAccuracyBest 作为距离过滤器,我会得到很好的结果。由于系统的区域监控已经处于低功耗状态,因此您不会仅仅通过将过滤器设置为最佳来消耗电池电量。

关于ios - CLLocationManager 的 didExitRegion 永远不会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14062468/

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