我已经开始使用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的东西吗?
答案 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");
}
}