【问题标题】:locationManager:didEnterRegion and didExitRegion are never getting called :iBeaconlocationManager:didEnterRegion 和 didExitRegion 永远不会被调用:iBeacon
【发布时间】:2013-12-28 02:32:45
【问题描述】:

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

}

这是我写的代码。

我需要在监听应用进入特定区域时创建本地通知,即使应用没有运行。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 当我在该区域时,locationManagerDidDetermineStateForRegion 委托成功调用。但是有什么方法可以识别信标(主要号码和次要号码)。传递给这个函数的参数是状态和区域。如果我尝试从区域访问主要和次要编号,它始终为空。我只从 region 参数中获取 uuid
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 只是为了确定:你写了'如果信标进入一个区域'。为了清楚起见:您进入信标区域,然后调用该方法,而不是相反。我对这种情况的假设是否正确?
      • 您不必为UIBackgroundModes 设置此位置值即可使iBeacon 监控工作。该值仅适用于在后台运行的导航应用以接收位置更新。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-19
        • 1970-01-01
        • 2012-10-27
        • 2013-10-12
        • 2012-03-27
        • 2013-08-29
        • 2013-11-03
        • 1970-01-01
        相关资源
        最近更新 更多