2

在使用信标(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

4 回答 4

2

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

于 2014-02-11T16:45:42.560 回答
1

这是我将使用的故障排除程序:

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

  2. 一旦你让它在前台工作,试着用肩膀按钮让它在后台工作。在前台(使用上述过程)时,始终让手机处于不在该区域的已知状态,因为在后台发生这种情况需要很长时间。一旦您知道您不在该地区,请通过关闭屏幕将您的应用程序置于后台。然后重新打开您的 iBeacon。由于您有 _beaconRegion.notifyOnEntry =YES,当您通过点击肩部或主页按钮强制显示时,您应该在一秒钟内收到回调。

  3. 完成这项工作后,您可以继续让手机检测背景中的存在,而无需按下肩部按钮。但请理解,这可能需要比您预期的更长的时间。有关更多详细信息,请参阅此讨论

于 2013-12-10T19:09:29.580 回答
0

您是否已在 info.plist 文件中为您的应用注册了后台位置更新?您需要在数组中添加一行UIBackgroundModes并添加一个项目location请参阅参考

于 2013-12-10T14:35:40.677 回答
0

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

于 2013-12-18T10:59:16.453 回答