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的东西?

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

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

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

您不需要调用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"); } }