iBeacon:获得主要和次要 - 只寻找uuid

时间:2013-11-21 15:03:49

标签: iphone ibeacon

我使用air locate示例并仅通过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];

然后在app delegate:

- (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...

}

非常感谢!

3 个答案:

答案 0 :(得分:20)

你没有做错任何事。看起来令人惊讶,监控API没有为您提供触发区域更改的特定信标。

未在CLBeaconRegion对象上设置major的原因是因为它与您用于开始监视的对象完全相同,并且您将该字段设置为nil(或者根本没有将其设置为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

答案 1 :(得分:4)

不幸的是,确定major和minor只能在iBeacon测距API中使用,而不是iBeacon监控API(如果仅由UUID监控)。此外,

1)当您的应用在后台时,iBeacon测距不起作用。这意味着如果您的应用程序处于后台(大多数情况下是这些类型的应用程序),除非您根据UUID,主要和次要进行监控,否则无法确定iBeacon的主要和次要。

2)您最多只能同时监控20个iBeacons。这意味着如果您使用UUID,主要和次要的监控(为了解决背景问题),您将仅限于20个iBeacons(在大多数实际情况下是一个很大的限制)。

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

所有这一切让我想知道为什么Apple首先不包括触发监控API进入/退出的iBeacons数组。我留下这个让Apple发表评论。以下帖子详细介绍了这些iBeacon行为/限制 - iBeacon in the background - Use cases

答案 2 :(得分:0)

  • CLBeaconRegion是查找信标的过滤条件。所以你传递的是当“didEnterRegion”代表火灾时你要回来的东西。没有惊喜。

  • CLBeacon是必须符合过滤条件才能触发didEnterRegion委托的单个信标。因此,您可以在这里找到主要的次要值。要获得触发的信标,您需要在停止测距之前调用测距API startRangingBeaconsInRegion并将其计数为5。在获得didEnterRegion回调后执行此操作。当您不想启动应用程序时,这可以满足信标的后台监控。但是,当用户通过信标在服务器上构建情报以获得更有针对性的广告系列时,请记下来。

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