【问题标题】:iBeacons Multiple MonitoringiBeacons 多重监控
【发布时间】:2014-10-01 18:30:53
【问题描述】:

我正在开发一个应用程序,该应用程序将有多个 ibeacons 来检测和响应。客户有不同的商店,他想在其中部署信标。我现在处于伊比肯之间非常接近的情况。所有信标共享相同的 UUID,但主要和次要值不同。

情况是这样的:

用户进入商店并通过信标监控收到第一条通知。现在要获得另一个信标的另一个通知,用户必须离开该区域并再次输入它以便didEnterRegion 调用,否则用户将不会收到其他信标的警报。在我的情况下,这并没有发生。信标彼此靠近,用户一旦进入该区域就不会真正离开该区域。一旦设备被锁定或应用程序被终止,通知就不会通过测距发送。

关于如何在真实案例中解决此问题的任何建议。如何在锁定屏幕上获取所有信标的通知。我正在使用 estimote 信标进行开发。

【问题讨论】:

  • 检查这两个:stackoverflow.com/questions/20124443/…stackoverflow.com/questions/19477044/… 似乎有两个选项:第一个是您可以为每个信标设置不同的区域并分别监控它们,这为每个信标提供didEnterRegion地区。但这仅限于 iOS 中的 20 个区域。第二个是你将监控和测距结合起来。即使你得到一个didEnterRegion,你也能覆盖所有的信标。

标签: ios ibeacon


【解决方案1】:

无法进行多个信标监控。由于 iOS 有限制,因此支持的最大区域数应为 20。我们可以通过执行以下操作来实现您的用例。

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

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

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

如果没有找到具有 “远” Proximity 的信标,那么您附近没有任何信标。 如果我们发现任何一个距离 的信标,则显示通知。如果发现多个信标的距离,则使用 RSSI 进行排序。最低 RSSI 将成为最近的信标并显示最近的信标。

未知 - 你可以忽略这个

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      这是一个常见问题。 如您所见,背景检测仅由区域监控触发,如果您的区域设置为覆盖同一物理区域中的多个信标,您将不会当您在它们之间移动时不会收到背景通知。

      您只能在后台获取每个应用最多 20 个 BeaconRegions 的进入/退出更新。因此,常见的解决方案是创造性地使用这 20 个 BeaconRegions 以获得最大效果。如果您在彼此的范围内有 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 来划分一个全球区域,但没有主要/次要值。在didRange 中,您仍将获得 Range 中任何信标的更新,而无需重复调用。
      • 确实你会得到更多的回调使用这个方案,但记住它是一台计算机,所以它并不关心。我怀疑它会对电池或CPU产生很大影响。也就是说,您当然可以为仅包含 ProximityUUID 的测距设置一个区域。我认为这并不重要。
      • 所以只是跟进“..每个应用程序最多 20 个 BeaconRegions...”的声明。如果您有一个应用程序监控区域 1..20,那么您还可以有第二个应用程序监控区域 21..40?我想如果是这样的话,一定有一个限制?
      • 这是一个更大的问题,无法在 cmets 中完全回答,但总的来说,是的,每个应用程序都有 20 个区域。没有公布的总体限制,但如果您有数十个或数百个应用程序都占用了它们的全部区域分配,则可能会出现实际的硬件和软件限制。
      猜你喜欢
      • 1970-01-01
      • 2023-03-22
      • 2015-05-29
      • 1970-01-01
      • 2014-04-29
      • 1970-01-01
      • 1970-01-01
      • 2014-01-13
      • 2017-10-30
      相关资源
      最近更新 更多