使用CoreLocation和iBeacons的问题

时间:2014-02-05 15:26:37

标签: ios objective-c core-location bluetooth-lowenergy ibeacon

我想构建一个具有室内本地化的应用程序(我知道蓝牙不是那么精确,但粗略的值一开始就够了)。 我的问题是,我只能在关闭和打开蓝牙后将放置在房间内的信标放置10秒钟。奇怪的是,关闭和打开蓝牙可以解决问题(再次持续10秒)。

以下是我的简单测试应用的代码段:

-(void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region
{
   BOOL beaconFound = NO;
   for(CLBeacon *beacon in beacons)
   {
       if(beacon.proximity == CLProximityNear)
       {
           _textView.text = @"A Beacon is Near!";
           beaconFound = YES;
       }
   }
   if(!beaconFound)
       _textView.text = @"No Beacon is Near";
}

iOS上有节能吗?我对此没有任何其他解释,但似乎没有其他人有这个问题。 我也试过在iPad上测试一个模拟的iBeacon但得到了相同的结果。

我希望能够不断地对信标进行测距,我做错了吗?

提前致谢

2 个答案:

答案 0 :(得分:0)

我不确定你是在前台还是后台进行测距。 我相信如果你在后台运行iOS,它只允许你在locationManager停止之前进行一段时间的测距。

另一件事是你只检查CLProximityNear。您可能想尝试检查三个区域。我测试了startRangingBeaconsInRegion并且结果在Near和Far之间来回跳跃,有时候立即。希望这有帮助。

switch (beacon.proximity) {
     case CLProximityImmediate:
          _textView.text = @"A Beacon is Immediate!";
          beaconFound = YES;
          break;
     case CLProximityNear:
          _textView.text = @"A Beacon is Near!";
          beaconFound = YES;
          break;
     case CLProximityFar:
          _textView.text = @"A Beacon is Far!";
          beaconFound = YES;
          break;
     default:
          break;
}

答案 1 :(得分:0)

尝试删除此限定符:

if(beacon.proximity == CLProximityNear)

我怀疑您与信标的距离通常会返回不同的值(可能是CLProximityFar或CLProximityImmediate)。如果为true,那么您在前10秒内看到结果的原因是因为在此期间接近值会大幅反弹。这可能会导致您在距离估计结束之前的那段时间内与CLProximityNear匹配。