locationManager:didEnterRegion和didExitRegion永远不会被调用:iBeacon

时间:2013-12-10 14:14:02

标签: ios objective-c core-location core-bluetooth ibeacon

在使用信标(ios设备)进行测试时,我发现听众信标出现了一些意想不到的行为。 locationManager:即使信标进入某个区域,也不会调用didEnterRegion方法。但是locationManager:didRangeBeacons:inRegion:被正确调用,并在那里显示检测到的信标。

- (void)startListening{

self.locationManager = [[CLLocationManager alloc] init];
[self.locationManager setDelegate:self];
NSUUID *myProximityUUID = [[NSUUID alloc]
                           initWithUUIDString:IDENTIFIER];
_beaconRegion = [[CLBeaconRegion alloc]
                 initWithProximityUUID:myProximityUUID
                 identifier:kPFTransmitterIdentifier];
_beaconRegion.notifyEntryStateOnDisplay = YES;
_beaconRegion.notifyOnEntry  =YES;
[self.locationManager startMonitoringForRegion:self.beaconRegion];

[self.locationManager requestStateForRegion:self.beaconRegion];
//[self.locationManager startRangingBeaconsInRegion:self.beaconRegion];

}

这是我写的代码。

我需要在侦听器应用程序进入特定区域时创建本地通知,即使该应用程序未运行。

4 个答案:

答案 0 :(得分:1)

以下是我将使用的故障排除步骤:

  1. 首先让它在前台工作。在前台运行您的应用程序,然后关闭您的iBeacon(如果它没有开关,则拔出电池或将其取出200英尺。)等待10秒钟(此时您应该收到区域外通知)然后转回iBeacon并验证您是否获得了区域内通知。如果你没有得到一个,我怀疑你的回调定义有问题。如果是这种情况,请发布该代码。

  2. 让它在前台工作后,尝试使用肩部按钮让它在后台运行。始终将手机置于处于前景的已知状态(使用上述步骤),因为在后台进行此操作需要很长时间。一旦您知道自己不在该地区,请关闭屏幕将您的应用程序置于后台。然后转回你的iBeacon。由于您有_beaconRegion.notifyOnEntry = YES,因此当您通过敲击肩部或主页按钮强制显示时,您应该在一秒钟内收到回调。

  3. 一旦你完成这项工作,你可以继续让手机在不按下肩部按钮的情况下检测到背景中的状态。但是要明白,这可能比您预期的要花费更长的时间。有关详细信息,请参阅this discussion

答案 1 :(得分:0)

您是否在info.plist文件中注册了应用以获取后台位置更新?您需要在数组UIBackgroundModes中添加一行并添加项locationSee reference

答案 2 :(得分:0)

在有时监视之前使用notifyEntryStateOnDisplay时不会调用didEnterRegion方法。我也在我的设备上测试了这个条件。可能你可以测试一次没有notifyEntryStateOnDisplay或notifyOnEntry条件。它会有所帮助。

答案 3 :(得分:0)

您的代码可能没有任何问题。我注意到,如果你在探测器已经位于信标区域(旁边)的时候打开你的测试信号,你将不会得到任何进入信标区域的通知。这很可能是因为iOS没有检测到过境点。 iOS似乎在检测到您已经越过“区域外”和“内部区域”(在任一方向)之间的边界时通知,然后才调用适当的委托方法。 要测试此功能,只需打开信标,但请关闭探测器。然后,如上面的davidgyoung所示,走近你的灯塔200英尺。然后打开探测器并走向信标。当您进入该区域时,您应该收到“didEnterBeaconRegion”通知。 您可以尝试的另一件事是实现“locationManagerDidDetermineStateForRegion”委托方法,只要您定义的受监视区域的状态发生变化,就会在您打开探测器时发生这种情况。如果这样做,即使您的探测器在启动时已经位于信标区域内,也应该进行回调。但请注意,这不会在后台发生,因此您仍然需要其他回调。