信标区域监控延迟并随机无法工作。(Android工作正常)

时间:2017-05-25 06:32:24

标签: ios ios10 ibeacon clregion region-monitoring

我开发的应用程序也是在android中开发的。

我已经在iOS中实现了信标区域监控,如下所示。

#pragma mark - Start/Stop Monitoring
- (void)startMonitoring {

    [self clearRegionWatch]; // This function removes the already registered monitored regions 

    NSArray *arrayOfSavedBeacons = [self getSavedBeacons];

    if([arrayOfSavedBeacons count]){
        for(Beacons *beaconModel in arrayOfSavedBeacons) {
            beaconModel.region.notifyOnEntry = YES;
            beaconModel.region.notifyOnExit = YES;
            beaconModel.region.notifyEntryStateOnDisplay = NO;
                NSLog(@"Monitoring start request: %@", [beaconModel dictionaryRepresentation]);
                    [locationManager startMonitoringForRegion:beaconModel.region];

                    [locationManager requestStateForRegion:beaconModel.region];
        }
    }
    else{
        UIAlertView* curr1=[[UIAlertView alloc] initWithTitle:@"No Beacons" message:@"No Beacon List Found From Server" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [curr1 show];
    }
}

以上是开始监控的代码。

以下是我为位置管理器实例初始化编写的代码。

 locationManager = [[CLLocationManager alloc] init];

        if([locationManager respondsToSelector:@selector(startMonitoringVisits)]) {
            //iOS 8.0 onwards
            [locationManager startMonitoringVisits];
        }
        if([locationManager respondsToSelector:@selector(allowsBackgroundLocationUpdates)]) {
            //iOS 9.0 onwards
            locationManager.allowsBackgroundLocationUpdates = YES;
        }
        if([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
            //iOS 8.0 onwards
            [locationManager requestAlwaysAuthorization];
        }

        locationManager.desiredAccuracy = kCLLocationAccuracyBest;
        [locationManager setDelegate:self];
        [locationManager startUpdatingLocation];

以上代码将在应用启动时初始化位置管理器。

我希望收到有关区域进入和退出事件的通知。

我的问题是我的Android应用程序可以从很远的距离检测到信标条目,而iOS应用程序无法检测到远处的区域进入或退出。

我不知道为什么会出现这种差异?

我观察到的是信标区域监控,有时会将进入退出通知延迟2到3分钟。

如果android可以检测到特定范围内的信标区域,那么为什么iOS应用程序无法检测到这一点?(这是两个应用程序都可以开始检测应用程序的范围形式的显着差异。)

任何建议或建议都会有所帮助。

感谢。

2 个答案:

答案 0 :(得分:1)

使用iOS CoreLocation,didEnterRegion监控回调是在首次检测到匹配区域的信标时进行的,而不管信标广告的信号强度。当蓝牙芯片首次看到广告时,应该触发回调,对于iOS和Android设备,这应该是类似的范围。虽然最大蓝牙检测范围肯定会因设备而异,并且可能会因添加一个外壳,将手机放入口袋或受阻碍而影响,但在典型使用中它并没有太大差异。

更可能解释为什么你看到检测延迟的是时间,而不是信号强度。在后台,iOS将遵循蓝牙芯片硬件检测插槽,以快速匹配您的信标区域。这是一种有限的资源,因此如果这些资源耗尽,iOS将回退到定期软件扫描进行检测,这可能需要15分钟。您可以通过将iOS设备放在Android首次检测到的相同位置来确认此假设,并等待它最终是否在该距离进行测试。

提高检测速度的一些提示:

  • 卸载可能监控iOS设备上信标的所有应用,因为它们可能正在耗尽有限的硬件加速插槽。 (设备上所有应用程序约为30个。)

  • 除非绝对必要,否则不要停止监控并重新启动。这将使您的应用程序排在最前,以获得硬件加速检测插槽。

  • 开始监控时,为信标启动测距。这不会影响背景检测时间,但会显着加快前景检测时间。

答案 1 :(得分:0)

如果您的应用程序在您进行测距时处于后台,则最多可能需要15分钟才能获得输入和存在的区域通知。如果您的应用程序在前台运行,您应该在一秒钟内输入区域通知,并在几秒钟内退出区域通知。

这不是beacon特定问题,而是在iOS中实现CoreLocation API的方式。