当我的屏幕被锁定时,我可以使用此方法进行后台调用:
-(void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region;
我希望获得有关iBeacon有多远的更精确数据。所以,我需要didRangeBeacons
方法。
didDetermineState
内调用该方法? CLProximityImmediate
吗?答案 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,这是一些经验。
用户按下主页后,您的应用只有很短的时间才能知道当前的ProximityImmediate,之后,您的应用将有机会在iPhone离开代表后离开信标区域时收到通知
(void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
由于推送通知或用户按下主页键,当iPhone屏幕亮起时,您的应用程序将有大约10秒的时间来了解当前的ProximityImmediate。您可以分叉my code以查看如何执行此操作。