【问题标题】:iBeacon: get major and minor - only looking for uuidiBeacon:获取主要和次要 - 只寻找 uuid
【发布时间】:2013-12-06 03:04:27
【问题描述】:

我正在使用空中定位示例并仅通过 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...

}

非常感谢!

【问题讨论】:

    标签: iphone ibeacon


    【解决方案1】:

    你没有做错任何事。令人惊讶的是,监控 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

    【讨论】:

    • 非常感谢大卫,这真的很有帮助。还要感谢您提供的其他非常宝贵的 SO 答案。
    • 好帖子。然而,一个小的修正。您在 didEnterRegion/didExitRegion 调用中获得的区域对象与您用于注册的 CLBeaconRegion 对象不同 - 它是一个副本。我知道这一点,因为起初我尝试使用 if (region == regionImTracking) 形式的代码并且比较失败。我记录了这两个区域,它们的地址不同,而它们的所有设置都匹配。
    • 是否有任何官方文档明确表示不可能?我知道这是真的,但我必须向管理层解释并指出其他事情,而不仅仅是人们“做出假设”。谢谢
    • 官方文档可能没有明确地说明这一点,以至于所有经理都可以理解,但它确实说明了这一点。请参阅下页的 locationManager:didDetermineState:forRegion: 部分,并注意它将传递的 Region 对象描述为“已确定状态的区域”。此区域对象不包含 iBeacon 标识符。 developer.apple.com/library/ios/documentation/CoreLocation/…
    【解决方案2】:

    不幸的是,如果您仅通过 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 in the background - Use cases

    【讨论】:

    • 您可能想在您链接的问题中查看有关在后台测距的 cmets。
    【解决方案3】:
    • CLBeaconRegion 是查找信标的过滤条件。因此,当“didEnterRegion”委托触发时,您传入的是您将要取回的内容。没有惊喜。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-29
      • 2014-11-12
      相关资源
      最近更新 更多