[位置管理器didEnterRegion]可以获取信标的Major和Minor吗?

6

我收到了一些来自Roximity的信标,从我所收集到的信息来看,所有Roximity的信标都具有相同的UUID。 我知道可以使用[locationManager: didRangeBeacons: inRegion:]获取major和minor值,但如果我设置[locationManager didEnterRegion]发送推送通知,并且我的用户经过与其他人应用程序相关的不同的Roximity信标,我如何在[locationManager didEnterRegion]中确定这一点?

2个回答

12

基本上你有两个选择。

  1. 定义你要监测的区域,包括你特定的主要和次要数字。主要限制是iOS只允许同时监测20个区域,这意味着你只能对20个不同的iBeacon这样做:

CLBeaconRegion *region1 = [[CLBeaconRegion alloc] initWithProximityUUID:[[NSUUID alloc] initWithUUIDString:@"8deefbb9-f738-4297-8040-96668bb44281"] major:1201 minor:3211 identifier:@"beacon1"];    
[_locationManager startRangingBeaconsInRegion:region1];    
CLBeaconRegion *region1 = [[CLBeaconRegion alloc] initWithProximityUUID:[[NSUUID alloc] initWithUUIDString:@"8deefbb9-f738-4297-8040-96668bb44281"] major:1798 minor:2122 identifier:@"beacon2"];    
[_locationManager startRangingBeaconsInRegion:region2];
...
  • 仅基于UUID监控一个区域,并同时对该区域进行测距。您将为每个特定的iBeacon接收到测距回调。(即使在后台,在进入该区域约5秒钟后,您也将收到此类回调) 在测距回调中,您检查所看到的信标的major/minor号码,并将其与您拥有的信标列表进行比较。只有当您看到匹配项时才执行特定操作。如果您不断添加信标,则保持应用程序中的列表最新可能会很困难,因此您可能希望使用像ProximityKit这样的Web服务,让您在云中存储iBeacon识别符列表。

  • -(void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region {
       for (CLBeacon *beacon in beacons) {
         if ([self isMyBeaconWithMajor: beacon.major minor: beacon.minor]) {
            // Yes, this is my beacon!  Do something special here
         }
       }
    }
    
    -(BOOL)isMyBeaconWithMajor: (NSNumber *)major minor: (NSNumber *)minor {
      // TODO: write code here that returns YES if the major and minor belong to you
    }
    

    还有一个最后的可能性(承认这可能超出了你所询问的范围),那就是使用具有自定义UUID的信标,这将使事情变得更容易。完全透明地说:我是一家销售带有可自定义标识符的iBeacon的公司的员工。


    非常感谢您提供的绝妙答案。昨天我尝试使用第二个选项,但是似乎效果不太好。我会再仔细看看的。 - Chris
    使用唯一的UUID为每个信标不会限制您一次只能监视多达20个吗? - random
    是的,但这并不完全是我所提出的。如果您定义自己独特的ProximityUUID,并将其用于所有自己的iBeacon上,那么当您看到该ProximityUUID时,您可以相当确定这些iBeacon属于您。 - davidgyoung
    @davidgyoung 我想知道信标的接近程度...使用didEnterRegion是否可能?我只想在信标的接近程度接近或立即时触发某些操作...这是否可能? - Mihir Mehta
    如果你想知道你与信标的距离,就不能使用didEnterRegion。你必须使用“didRangeBeacons:InRegion:”。但请注意,在后台进行范围限制的时间有限,通常在操作系统将应用程序置于睡眠状态之前仅有大约10秒钟的时间。 - davidgyoung
    显示剩余2条评论

    -1

    你可以使用以下代码确定主版本和次版本:

    - (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region{
         CLBeaconRegion *r = (CLBeaconRegion *) region;
         NSLog(@"UUID %@, major %@, minor %@", r.proximityUUID, r.major, r.minor);
         [self myNotification:@"You are in the region"];
         [self.locationManager startRangingBeaconsInRegion:r];
    }
    

    4
    这个代理方法返回正在被监控的区域。基本上,它表示“嘿,你告诉我要监控的那个区域刚刚被进入了”,但它并没有告诉你有关广告该区域的信标的任何信息。因此,返回的主要和次要值将是你自己设置的,而不是触发通知的信标区域的值。 - joshblour

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