iBeacon在后台测距?

时间:2014-01-09 10:03:18

标签: ios core-location ibeacon

我已经开始使用estimotes作为信标来测试iBeacons。

这一切都运行得很好,但我正在努力让应用程序在后台运行正常。

self.region = [[CLBeaconRegion alloc] initWithProximityUUID:self.uuid identifier: self.deviceID];
self.region.notifyEntryStateOnDisplay = YES;
[self.locationManager startMonitoringForRegion:self.region];

所以这是基本的设置,对于我的测试应用程序,我希望在我的手机紧邻信标时显示本地通知。我的问题是,除非我包含以下行,否则它将无效。

[self.locationManager startUpdatingLocation];

任何人都能解释为什么会这样或者我错过了一些关于iBeacons的东西吗?

3 个答案:

答案 0 :(得分:3)

你错了。您无需调用startUpdatingLocation即可在后台调用。

当您在后台时,进入某个区域时需要更长时间才能收到通知。如果要进行范围调用,则还必须发出startRangingBeaconsInRegion调用。正如另一张海报指出的那样,当检测到新的信标时,你只能从后台获得几秒的测距呼叫。 (你得到一个didEnterRegion,接着是几个测距调用,然后你的应用程序就会重新入睡。)

答案 1 :(得分:1)

不,你没有遗漏任何东西。在后台,你的应用程序只需要很少的时间来进行测距。根据我的个人经验,您可以获得大约3到5个不同的回调。多数民众赞成。

答案 2 :(得分:1)

您无需拨打startUpdatingLocation方法。

startMonitoringForRegion方法仅开始监视区域并调用didStartMonitoringForRegion委托方法,以便在信标进入/退出区域时通知您。

您需要调用startRangingBeaconsInRegion方法,该方法调用didRangeBeacons委托方法,该方法为您提供检测到的信标数组,其中包含信标的UUID,major,minor,rssi信息。

对于后台执行,只需使用UIBackgroundTaskIdentifier,您的代码也可以在后台运行。

- (void)applicationDidEnterBackground:(UIApplication *)application
 {
    NSLog(@"=== DID ENTER BACKGROUND ===");
    UIBackgroundTaskIdentifier bgTask = [[UIApplication  sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
          NSLog(@"End of tolerate time. Application should be suspended now if we do not ask more 'tolerance'");
       }];

   if (bgTask == UIBackgroundTaskInvalid) {
        NSLog(@"This application does not support background mode");
    }
    else {
       //if application supports background mode, we'll see this log.
       NSLog(@"Application will continue to run in background");
    }
}