iBeacons多重监控

7
我正在开发一个应用程序,它将有多个ibeacon以进行检测和反应。客户有不同的商店需要部署ibeacon。现在我遇到了这样一种情况:ibeacon非常靠近彼此。所有的beacon共享相同的UUID,但major和minor值不同。
情况如下:用户进入商店并通过beacon监控接收第一条通知。现在,为了获取其他beacon的通知,用户必须离开区域并再次进入才能调用didEnterRegion,否则用户将无法获取其他beacon的警报。但是,在我的情况下,这种情况并没有发生。由于beacon彼此接近,因此用户实际上并没有离开区域。一旦设备锁定或应用程序被关闭,通知也不会通过范围传递。
在实际情况中,有什么建议来解决这个问题?如何在锁定屏幕上获取所有beacon的通知?我正在使用Estimote Beacon进行开发。

请检查以下两个链接:https://dev59.com/KXnZa4cB1Zd3GeqPpmm5?lq=1和https://dev59.com/TmIk5IYBdhLWcg3wN7xj。看起来有两种选择:第一种方法是您可以为每个信标设置不同的区域并单独监视它们,这会为每个区域提供“didEnterRegion”。但是在iOS中,此方法仅限制为20个区域。第二种方法是您可以将监视和扫描结合起来。即使您获得一个“didEnterRegion”,也会对所有信标进行扫描。 - knshn
3个回答

7

这是一个常见问题。 如您所见,背景检测仅由区域监视触发,如果您的区域设置涵盖同一物理区域内的多个信标,则在移动之间您将无法收到背景通知。

每个应用程序最多只能获得20个BeaconRegion的进入/退出更新。因此,常见解决方案是创造性地使用这些20个BeaconRegion以获得最佳效果。如果您有20个或更少数不同的信标在彼此的范围内,技巧很简单--您只需为每个信标创建一个区域,并在所有这些区域上进行监视。

如果您需要使用> 20个信标,则必须想出一个有助于此的编号方案。例如,您可以将所有信标的ProximityUUID设置为相同的值,将主值编号为1-20,然后将次要值设置为每个信标的唯一数字。然后,您将监视具有不同主要数字的20个区域。您还将设置同时扫描以便能够获取检测到的信标的次要标识符。就像这样:

  CLBeaconRegion *region1 = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:@"region1" major:1 ];
  CLBeaconRegion *region2 = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:@"region2" major:2 ];
  ...
  CLBeaconRegion *region20 = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:@"region20" major:20 ];

  [locationManager startMonitoringBeaconsInRegion:region1];
  [locationManager startRangingBeaconsInRegion:region1];
  [locationManager startMonitoringBeaconsInRegion:region2];
  [locationManager startRangingBeaconsInRegion:region2];
  ...
  [locationManager startMonitoringBeaconsInRegion:region20];
  [locationManager startRangingBeaconsInRegion:region20];

如果您能确保永远不会出现两个具有相同次要编号的信标同时处于移动设备的无线电范围内的情况(例如,具有相同次要编号的信标必须相距>100米),那么此技术将运作良好。如果无法做到这一点,则必须开始妥协。


如果你枚举所有这些信标,你会得到大量的重复调用。我喜欢使用UUID来枚举一个全局区域,但不包括major/minor值。在didRange中,你仍然会收到任何处于范围内的信标的更新,而不会重复调用。 - Logan
1
这种方案确实会获得更多的回调,但请记住它只是一台计算机,所以它并不真正关心。我怀疑它对电池或CPU的影响不大。话虽如此,您可以为范围设置一个单独的区域,其中仅包括ProximityUUID。我认为这并不重要。 - davidgyoung
所以,就跟随“..每个应用程序最多20个BeaconRegions”的声明。如果您有一个应用程序监视区域1..20,那么您也可以有第二个应用程序监视区域21..40?我假设如果是这种情况,那么肯定会有限制吧? - Mark Chidlow
1
这个问题比在评论中完全回答要大,但总的来说,是的,每个应用程序都有20个区域。没有公布的总限制,但如果你有数十个或数百个应用程序都占用它们的全部区域,可能会出现实际的硬件和软件限制。 - davidgyoung

1

无法进行多个信标的监控。由于iOS存在限制,最大支持区域数量为20。我们可以通过以下方式实现您的用例。

  • 将所有信标分组为单一UUID。我们可以监视一个区域而不是多个区域
  • 通过测距捕获附近的信标(仅当用户进入或退出时,监视才会触发。当用户在该区域内停留时间较长时,监视委托将不会触发)。通过didRange方法接收到的接近度对信标进行排序。

如果没有找到任何一个具有"Immediate"接近度的信标,则移至下一个接近度Near。如果我们发现任何一个具有“Immediate”接近度的信标,则显示通知。如果发现多个具有“Immediate”接近度的信标,则使用RSSI进行排序。最低RSSI将是最近的信标,并显示最近的信标的通知。

如果没有找到任何一个具有"Near"接近度的信标,则移至下一个接近度Far。如果我们发现任何一个具有"Near"接近度的信标,则显示通知。如果发现多个具有"Near"接近度的信标,则使用RSSI进行排序。最低RSSI将是最近的信标,并显示最近的信标的通知。

如果没有发现距离为“远”的信标,则附近没有信标。 如果找到一个距离为“远”的信标,则显示通知。如果有多个距离为“远”的信标,则使用RSSI进行排序。最低的RSSI将是最近的信标,并显示最近的信标的通知。
未知 - 您可以忽略此内容。

0
你可以更轻松地解决这个问题。当用户退出区域时,停止触发通知,改用接近功能,这将为您提供更多的灵活性:使用CLProximity。您可以在立即、接近、远等之间进行选择。因此,根据信标的次要信息和其接近程度,您可以触发所需的通知。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接