在后台消防方法(iBeacon)

时间:2014-03-15 12:09:21

标签: ibeacon

当我的屏幕被锁定时,我可以使用此方法进行后台调用:

-(void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region;

我希望获得有关iBeacon有多远的更精确数据。所以,我需要didRangeBeacons方法。

  • 是否可以在后台didDetermineState内调用该方法?
  • 还是有另一种方法可以在应用程序处于后台时找出信标是CLProximityImmediate吗?

5 个答案:

答案 0 :(得分:1)

是的,你可以,最好的方法是在注册区域监控时开始测距。

[self.locationManager startMonitoringForRegion:region];
[self.locationManager startRangingBeaconsInRegion:region];

然后,当您在后台接收区域回调后,您将获得大约5秒的测距。

我会定义以下回调:

- (void)locationManager:(CLLocationManager *)manager
      didDetermineState:(CLRegionState)state
              forRegion:(CLRegion *)region
{
  // Get the initial state of the beacon regions
}
- (void)locationManager:(CLLocationManager *)manager
         didEnterRegion:(CLRegion *)region
{
  // Get updates for the beacon regions
}
- (void)locationManager:(CLLocationManager *)manager
        didRangeBeacons:(NSArray *)clBeacons
               inRegion:(CLBeaconRegion *)region 
{
  // Get ranges for actual beacons
}

请记住,您只能在有限的时间内完成测距,一旦背景时间结束,您将停止接收回调。

这意味着您只需几秒钟来确定您的位置。因此,如果您想要在某个距离可能因为iOS停止后台进程而错过某个距离时触发事件

但是如果你拥有iBeacon硬件,你可以通过调整它正在广播的功率输出来解决这个限制。我们通过降低功率来成功,以便在您靠近信标之前不会发生进入区域事件。如果你这样做,估计的距离需要重新校准,但它可以完成工作。

答案 1 :(得分:0)

是的,您可以从startRangingBeaconsInRegion致电CLLocationManager didDetermineState。只需确保检查状态为CLRegionStateInside。但请记住,您只需2-3秒的运行时间。所以你的didRangeBeacons只会收到一些回调。之后,您的应用程序将再次入睡。样本可能是这样的:

- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region {
    if ([region isKindOfClass:[CLBeaconRegion class]]) {
        CLBeaconRegion *beaconRegion = (CLBeaconRegion *)region;
        if (state == CLRegionStateInside) {
            //now start ranging
            [_locationManager startRangingBeaconsInRegion:beaconRegion];
        }
    }
}

要回答你的第二个问题,不。这是唯一推荐的方式。

答案 2 :(得分:0)

即使屏幕关闭(没有亮起),我也尝试过很多东西让它在后台工作。根据我的观察this允许我在后台进行测距。调用完成处理程序时,您还可以尝试撤消下一次后台工作。不确定它在iOS 7.1下是如何工作的,但至少对于7.0它会得到相当好的结果。

答案 3 :(得分:0)

根据我的经验,当应用程序在后台时,所有这四个都是连续测距更新所必需的:

self.locationManager.pausesLocationUpdatesAutomatically = NO;
[self.locationManager startMonitoringForRegion:beaconRegion];
[self.locationManager startRangingBeaconsInRegion:beaconRegion];
[self.locationManager startUpdatingLocation];

位置更新和使用蓝牙LE配件也必须在后台功能中设置。

This walkthrough构建了一个应用程序,可以在应用程序背景化时获得邻近更新(近,远,立即)。

答案 4 :(得分:0)

我的最后一次创业是关于iBeacon,这是一些经验。

  1. 用户按下主页后,您的应用只有很短的时间才能知道当前的ProximityImmediate,之后,您的应用将有机会在iPhone离开代表后离开信标区域时收到通知

    (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region

  2. 由于推送通知或用户按下主页键,当iPhone屏幕亮起时,您的应用程序将有大约10秒的时间来了解当前的ProximityImmediate。您可以分叉my code以查看如何执行此操作。