1

我已经开发了同样在 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 应用程序无法检测到这一点?(两个应用程序都可以开始检测应用程序的范围形式存在显着差异)。

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

谢谢。

4

2 回答 2

2

使用 iOS CoreLocation,无论信标广告的信号强度如何,都会didEnterRegion在第一次检测到与区域匹配的信标时进行监控回调。回调应该在蓝牙芯片第一次看到广告时触发,这对于 iOS 和 Android 设备来说应该是相似的范围。虽然最大蓝牙检测范围在设备之间肯定会有所不同,并且可能会受到添加外壳、将手机放入口袋或障碍物的影响,但在典型使用中它并没有太大差异。

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

加快检测速度的一些提示:

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

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

  • 当您开始监控时,开始对信标进行测距。这不会影响背景检测时间,但会显着加快前景检测时间。

于 2017-05-25T14:20:02.783 回答
0

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

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

于 2017-05-25T09:27:59.390 回答