7

我正在使用空中定位示例并仅通过 uuid 监视 iBeacons。当我得到输入的区域事件时,如果我只是在寻找 uuid,我似乎无法从触发事件的信标/区域中获取主要和次要(如果我正在监视 uuid 则可以)指定的主要和次要) - 有人知道这样做的方法/我错过了什么吗?

我真的不想开始测距-似乎我不需要……

(用例是说许多商店都使用具有相同 uuid 的信标,然后发出操作系统通知,其中包含有关该商店的相关信息(通过查询主要和次要获得))

这基本上是我所做的:

CLBeaconRegion *region = [[CLBeaconRegion alloc] initWithProximityUUID:uuid
identifier:@"blah"];
region.notifyOnEntry = YES;
region.notifyOnExit = YES;
region.notifyEntryStateOnDisplay = YES;

[self.locationManager startMonitoringForRegion:region];

然后在应用委托中:

- (void) locationManager:(CLocationManager*)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion*)region {

    // assume for now its the iBeacon
    CLBeaconRegion *beaconRegion = (CLBeaconRegion*) region;

    beaconRegion.major  // hasn't been set...

}

非常感谢!

4

3 回答 3

20

你没有做错什么。令人惊讶的是,监控 API 并没有为您提供触发区域更改的特定信标。

未在 CLBeaconRegion 对象上设置专业的原因是因为它与您用于开始监视的对象完全相同,并且您将该字段设置为 nil(或者根本没有设置它而使其为零)。您正在寻找的是一个额外的 CLBeacon 对象数组。正如您所建议的,这仅存在于 Ranging API 上。

开始测距真的没什么大不了的。只需在您开始监控的同时进行设置:

CLBeaconRegion *region = [[CLBeaconRegion alloc] initWithProximityUUID:uuid
identifier:@"blah"];
region.notifyOnEntry = YES;
region.notifyOnExit = YES;
region.notifyEntryStateOnDisplay = YES;

[self.locationManager startMonitoringForRegion:region]; 
[self.locationManager startRangingBeaconsInRegion:region]; 

如果你只关心第一次测距调用,你可以使用一个标志来忽略进一步的更新:

-(void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region {
    if (!_firstOneSeen) { 
        // Do something with beacons array here
    }
}

并在您离开该地区时重置该标志

- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region {
    _firstOneSeen = NO;
}

作为奖励,当您的应用程序处于前台时,这也将使您的监控响应时间更快。请参阅:http: //developer.radiusnetworks.com/2013/11/13/ibeacon-monitoring-in-the-background-and-foreground.html

于 2013-11-22T03:06:28.947 回答
4

不幸的是,如果您仅通过 UUID 进行监控,则仅在 iBeacon 测距 API 和 iBeacon 监控 API 中才能确定主要和次要。此外,

1) 当您的应用程序在后台时,iBeacon 测距不起作用。这意味着如果您的应用程序在后台(这些类型的应用程序大部分时间都是如此),除非您基于 UUID、主要和次要进行监控,否则您无法确定 iBeacon 的主要和次要。

2) 您最多只能同时监控 20 个 iBeacon。这意味着,如果您通过主要和次要 UUID 进行监控(以绕过后台问题的范围),您将被限制为只有 20 个 iBeacon(在大多数实际情况下是一个很大的限制)。

3) 为了获得最大的可扩展性(因为您只能同时监控 20 个 iBeacon),最好仅通过 UUID 进行监控,当检测到该 UUID 的 iBeacon 时通知用户,并在收到通知后用户可以确认将应用程序置于前台. 一旦应用程序处于前台,就可以进行测距以确定 iBeacon 的主要和次要。

所有这些让我想知道为什么 Apple 没有首先在监控 API 中包含触发进入/退出的 iBeacons 数组。我把这个留给苹果评论。以下帖子详细介绍了这些 iBeacon 行为/限制 -后台 iBeacon - 用例

于 2014-02-12T16:18:38.783 回答
0
  • CLBeaconRegion 是查找信标的过滤条件。因此,当“didEnterRegion”委托触发时,您传入的是您将要取回的内容。那里没有惊喜。

  • CLBeacon 是必须符合过滤条件才能触发 didEnterRegion 委托的单个信标。所以在这里你可以找到主要的、次要的价值。要获得触发的信标,您需要调用测距 API startRangingBeaconsInRegion 并在停止测距之前将其计数为 5。在收到 didEnterRegion 回调后执行此操作。当您不想启动应用程序时,这适用于信标的后台监控。但只需记下用户何时经过一个信标,以便在服务器上构建智能以进行更有针对性的广告活动。

有时测距可能找不到任何信标,在这种情况下,在 startRangingBeaconsInRegion 的回调中使用 beaconRegion 来记下有人进入了信标区域。

于 2014-08-18T20:20:34.767 回答