0

我正在开发 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”值,并使用不同的监控区域半径值来修复错误。但它没有用。

4

0 回答 0