Ios 即使应用程序位于同一位置,信标的接近范围也会前后变化

Ios 即使应用程序位于同一位置,信标的接近范围也会前后变化,ios,iphone,ios7,location,ibeacon,Ios,Iphone,Ios7,Location,Ibeacon,信标接近范围将接近响应更改为“近-立即-远”,即使ios设备保持在同一位置 当接近响应接近时,我打开视图。我得到来回的接近反应,接近-立即,然后接近。它一次又一次地显示视图 我们怎样才能解决这个问题。是否有任何事件处理程序 谢谢。接近度和准确度值似乎非常“嘈杂”。这也取决于您的环境。水(也就是人)吸收了蓝牙使用的频率,所以人们移动会产生影响,但我观察到,当两台设备都放在我的桌子上时,变化范围在1.2米到1.9米之间 我想你将不得不处理应用程序中的噪音。一旦视图打开,您应该将其保持打开状态,直到信

信标接近范围将接近响应更改为“近-立即-远”,即使ios设备保持在同一位置

当接近响应接近时,我打开视图。我得到来回的接近反应,接近-立即,然后接近。它一次又一次地显示视图

我们怎样才能解决这个问题。是否有任何事件处理程序


谢谢。

接近度和准确度值似乎非常“嘈杂”。这也取决于您的环境。水(也就是人)吸收了蓝牙使用的频率,所以人们移动会产生影响,但我观察到,当两台设备都放在我的桌子上时,变化范围在1.2米到1.9米之间

我想你将不得不处理应用程序中的噪音。一旦视图打开,您应该将其保持打开状态,直到信标“远”(或您获得区域出口)一段时间。如果状态转换回接近或立即,则重置计时器

您需要使用以下类似的代码-

-(void)locationManager:(CLLocationManager *)manager
    didRangeBeacons:(NSArray *)beacons
           inRegion:(CLBeaconRegion *)region {

    CLBeacon *beacon=beacons[0];

    switch (beacon.proximity) {

    case CLProximityFar:
        if (self.farTimer==nil) {
            self.farTimer=[NSTimer scheduledTimerWithTimeInterval:30 target:self selector:@selector(farTimerFired:) userInfo:beacon repeats:NO];
        }
    break;

    case CLProximityNear:
    case CLProximityImmediate:
        if (self.farTimer!=nil) {
            [self.farTimer invalidate];
            self.farTimer=nil;
        }
    break;

    case CLProximityUnknown:
         NSLog(@"Beacon proximity is unknown");
    break;
   }
}

-(void) farTimerFired:(NSTimer *)timer {
 CLBeacon *beacon=(CLBeacon *)timer.userInfo;
 NSLog(@"Beacon %@ is really far",beacon.proximityUUID.UUIDString);
 self.farTimer=nil;
}

接近度和精度值似乎相当“嘈杂”。这也取决于您的环境。水(也就是人)吸收了蓝牙使用的频率,所以人们移动会产生影响,但我观察到,当两台设备都放在我的桌子上时,变化范围在1.2米到1.9米之间

我想你将不得不处理应用程序中的噪音。一旦视图打开,您应该将其保持打开状态,直到信标“远”(或您获得区域出口)一段时间。如果状态转换回接近或立即,则重置计时器

您需要使用以下类似的代码-

-(void)locationManager:(CLLocationManager *)manager
    didRangeBeacons:(NSArray *)beacons
           inRegion:(CLBeaconRegion *)region {

    CLBeacon *beacon=beacons[0];

    switch (beacon.proximity) {

    case CLProximityFar:
        if (self.farTimer==nil) {
            self.farTimer=[NSTimer scheduledTimerWithTimeInterval:30 target:self selector:@selector(farTimerFired:) userInfo:beacon repeats:NO];
        }
    break;

    case CLProximityNear:
    case CLProximityImmediate:
        if (self.farTimer!=nil) {
            [self.farTimer invalidate];
            self.farTimer=nil;
        }
    break;

    case CLProximityUnknown:
         NSLog(@"Beacon proximity is unknown");
    break;
   }
}

-(void) farTimerFired:(NSTimer *)timer {
 CLBeacon *beacon=(CLBeacon *)timer.userInfo;
 NSLog(@"Beacon %@ is really far",beacon.proximityUUID.UUIDString);
 self.farTimer=nil;
}

请理解邻近值只是一个值,因此这是由于@Paulw11在其回答中所说的噪声引起的预期行为

要使接近度(和准确度)读数尽可能可靠,可以做两件事:

  • 选择传输速率尽可能快的iBeacon。不同的iBeacon以不同的频率发送广告,频率从每秒30次到每秒一次或更少。通常,更快的传输速率可以减少距离估计的噪音,因为它们可以为iOS提供更多的无线电信号强度测量。对于您的测试,请尝试基于iOS的iBeacon,看看它是否有帮助。已知每秒传输30次

  • 确保您的iBeacon已正确校准。这不会降低噪音,但它会确保你得到的读数尽可能平均正确。如果未正确校准,则当设备稳固地位于即时区域时,您可能会更频繁地看到即时和近距离之间的跳跃,因为它计算的距离太远


  • 除此之外,如@Paulw11所示,对邻近值进行软件筛选可能会有所帮助,但它仍然不是完美的。你只需要决定你是否能忍受你用例中的噪音

    了解邻近值只是一个,因此这是由于@Paulw11在其回答中所说的噪声引起的预期行为

    要使接近度(和准确度)读数尽可能可靠,可以做两件事:

  • 选择传输速率尽可能快的iBeacon。不同的iBeacon以不同的频率发送广告,频率从每秒30次到每秒一次或更少。通常,更快的传输速率可以减少距离估计的噪音,因为它们可以为iOS提供更多的无线电信号强度测量。对于您的测试,请尝试基于iOS的iBeacon,看看它是否有帮助。已知每秒传输30次

  • 确保您的iBeacon已正确校准。这不会降低噪音,但它会确保你得到的读数尽可能平均正确。如果未正确校准,则当设备稳固地位于即时区域时,您可能会更频繁地看到即时和近距离之间的跳跃,因为它计算的距离太远


  • 除此之外,如@Paulw11所示,对邻近值进行软件筛选可能会有所帮助,但它仍然不是完美的。你只需要决定你是否能忍受你用例中的噪音

    我看到的问题是,当我将信标和iOS设备并排放置时,虽然距离很近,但问题仍然存在。它会在几秒钟后将“接近”改为“接近”。这很好,因为“立即”比“接近”。一旦在“近”触发,您需要观察状态是否更改为“远”(或区域已退出)。当你得到一个“远”开始一个计时器-如果你仍然在“远”一段时间,那么你是'真的'远。如果返回到“接近”或“立即”,则重置进程如何启动“远”计时器?我尝试了很多方法,但即使计时器启动,也没有立即或接近地调用。如果你调用另一个带有performSegue的视图,并且有延迟,它就会工作。但是如果你想保持相同的观点?我该怎么办?@mad_mask查看我添加到答案中的示例代码非常感谢Paulw11。今天我会尝试一下。我看到的问题是,当我将信标和iOS设备并排放置时,虽然距离很近,但问题仍然存在。它会在几秒钟后将“接近”改为“接近”。这很好,因为“立即”比“接近”。一旦在“近”触发,您需要观察状态是否更改为“远”(或区域已退出)。当你得到一个“远”开始一个计时器-如果你仍然在“远”一段时间,那么你是'真的'远。如果返回到“接近”或“立即”,则重置进程如何启动“远”计时器?我尝试了很多方法,但即使计时器启动,也没有立即或接近地调用。如果你调用另一个带有performSegue的视图,并且有延迟,它就会工作。但是如果你想保持相同的观点?我该怎么办?@mad_mask看到样品了吗