信标区域监控延迟并且随机不工作。(Android 工作正常)
Beacon Region Monitoring Get Delayed and randomly not working.(Android is working fine)
我开发了也在 android 中开发的应用程序。
我在iOS实现了beacon区域监控如下。
#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应用程序无法检测到这个?(两个应用程序都可以开始检测应用程序的范围形式存在显着差异) .
任何意见或建议都会有所帮助。
谢谢。
如果您的应用程序在您进行测距时处于后台,则最多可能需要 15 分钟才能收到进入和存在的区域通知。如果您的应用 运行 在前台,您应该会在一秒钟内收到进入区域通知,并在几秒钟内收到退出区域通知。
这不是 beaconSpecific 问题,但 CoreLocation API 的方式在 iOS 中实现。
使用 iOS CoreLocation,didEnterRegion
监视回调是在首次检测到与区域匹配的信标时进行的 无论信标广告的信号强度如何.回调应该在蓝牙芯片第一次看到广告时触发,并且 iOS 和 Android 设备的范围应该相似。虽然最大蓝牙检测范围在设备之间肯定会有所不同,并且可能会受到添加外壳、将 phone 放在口袋中或受到障碍物的影响,但在典型使用中它不会有太大差异。
您看到检测延迟的一个更可能的解释是时间,而不是信号强度。在后台,iOS 将遵从蓝牙芯片硬件检测槽以快速匹配您的信标区域。这是一种有限的资源,因此如果这些都用完了,iOS 将回退到定期软件扫描进行检测,这最多可能需要 15 分钟。您可以将 iOS 设备放在 Android 首次检测到的相同位置,然后等待它最终是否会在该距离进行测试,从而证实这一假设。
一些可以加快检测速度的技巧:
卸载所有可能会在您的 iOS 设备上监控信标的应用程序,因为它们可能会耗尽有限的硬件加速插槽。 (设备上的所有应用大约有 30 个。)
除非绝对必要,否则不要停止监视并重新启动。这将使您的应用排在最后,以获得硬件加速检测槽。
开始监视时开始对信标进行测距。这不会影响背景检测时间,但会显着加快前景检测时间。
我开发了也在 android 中开发的应用程序。
我在iOS实现了beacon区域监控如下。
#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应用程序无法检测到这个?(两个应用程序都可以开始检测应用程序的范围形式存在显着差异) .
任何意见或建议都会有所帮助。
谢谢。
如果您的应用程序在您进行测距时处于后台,则最多可能需要 15 分钟才能收到进入和存在的区域通知。如果您的应用 运行 在前台,您应该会在一秒钟内收到进入区域通知,并在几秒钟内收到退出区域通知。
这不是 beaconSpecific 问题,但 CoreLocation API 的方式在 iOS 中实现。
使用 iOS CoreLocation,didEnterRegion
监视回调是在首次检测到与区域匹配的信标时进行的 无论信标广告的信号强度如何.回调应该在蓝牙芯片第一次看到广告时触发,并且 iOS 和 Android 设备的范围应该相似。虽然最大蓝牙检测范围在设备之间肯定会有所不同,并且可能会受到添加外壳、将 phone 放在口袋中或受到障碍物的影响,但在典型使用中它不会有太大差异。
您看到检测延迟的一个更可能的解释是时间,而不是信号强度。在后台,iOS 将遵从蓝牙芯片硬件检测槽以快速匹配您的信标区域。这是一种有限的资源,因此如果这些都用完了,iOS 将回退到定期软件扫描进行检测,这最多可能需要 15 分钟。您可以将 iOS 设备放在 Android 首次检测到的相同位置,然后等待它最终是否会在该距离进行测试,从而证实这一假设。
一些可以加快检测速度的技巧:
卸载所有可能会在您的 iOS 设备上监控信标的应用程序,因为它们可能会耗尽有限的硬件加速插槽。 (设备上的所有应用大约有 30 个。)
除非绝对必要,否则不要停止监视并重新启动。这将使您的应用排在最后,以获得硬件加速检测槽。
开始监视时开始对信标进行测距。这不会影响背景检测时间,但会显着加快前景检测时间。