我正在开发 4-5 个月的区域监控,之前它运行良好。一周前或之前,当我们在 IOS 7.1 的设备上测试代码时,我们发现了一个问题:
- 当检测到一个注册区域时,它永远不会再次被检测到,直到用户远离该区域 10Km 的距离,如果用户从未跨越这个 10Km 的范围,则不会为该区域调用进入/退出事件。如果用户距离检测到的区域 10 公里远,将调用其 Exit 事件,当用户回到注册区域附近时,将仅触发 Enter 事件。
这是我的代码:-我制作了一个位置管理器,并在位置管理器中对其进行了初始化:
if (locationManager == nil)
{
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.distanceFilter = kCLDistanceFilterNone;
locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
if ([locationManager respondsToSelector:@selector(activityType)])
{
[locationManager setActivityType:CLActivityTypeFitness];
}
if ([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)])
{
[locationManager requestAlwaysAuthorization];
}
}
然后我获取用户的当前位置并将其发送到服务器,以获取附近的地理围栏区域,并将它们注册为如下监控:
- (void)startRegionMonitoring:(NSArray*)regions { [self unregisterRegionMonitoring]; if ([Helper isValidForRegionMonitoring]) { [locationManager setDelegate:self]; int MAX_REGION = regions.count > 20 ? 20 : regions.count; for (int index=0; index<MAX_REGION; index++) { NSString *identifier = [NSString stringWithFormat:@"Identfier %d", index+1]; CLLocationCoordinate2D centerCoordinate = CLLocationCoordinate2DMake([[[regions objectAtIndex:index] valueForKey:@"lat"] doubleValue], [[[regions objectAtIndex:index] valueForKey:@"lon"] doubleValue]); CLRegion *region = nil; double radius = 200.0; if ([Helper isIOS7]) { region = [[[CLCircularRegion alloc] initWithCenter:centerCoordinate radius:radius identifier:identifier] autorelease]; } else { region = [[[CLRegion alloc] initCircularRegionWithCenter:centerCoordinate radius:radius identifier:identifier] autorelease]; } [locationManager startMonitoringForRegion:region]; } } }
我尝试了不同的“distanceFilter”、“DesiredAccuracy”值,并使用不同的监控区域半径值来修复错误。但它没有用。