【问题标题】:locationManager:didEnterRegion not called when a beacon is detected检测到信标时未调用 locationManager:didEnterRegion
【发布时间】:2013-10-15 07:18:42
【问题描述】:

在使用信标(iOS 设备)进行测试时,我发现侦听器信标出现了一些意外行为。 locationManager:didEnterRegion 方法不会被调用,即使信标进入一个区域。但是 locationManager:didRangeBeacons:inRegion: 被正确调用,并且检测到的信标显示在那里。有没有人经历过这样的事情。

【问题讨论】:

  • 在解决问题 1.5 天后。问题出在飞行模式上。如果飞行模式开启,iBeacon 测距可以正常工作,但不能监控。遗憾的是没有错误或任何错误

标签: ios core-location core-bluetooth ibeacon


【解决方案1】:

如果没有关于你的测试开始条件的更多细节,我很难说我是否看到了完全相同的东西。但是,是的,在某些特定情况下,我看到即使没有调用 locationManager:didEnterRegion,也会调用 locationManager:didRangeBeacons:inRegion。

如果您在同一区域同时开始测距和监控,并且 iOS 认为您已经在监控区域中,那么您可能不会收到对 locationManager:didEnterRegion 的调用。

要真正测试是否有问题,您需要设置一个测试用例:

  1. 确保您不在该地区。
  2. 让 iOS 运行几分钟
  3. 开始监控该区域
  4. 让 iOS 继续运行几分钟
  5. 输入地区。
  6. 看看你是否接到了 locationManager:didEnterRegion 的电话

如果经过以上步骤,还是没有接到电话,那肯定是有问题了。

【讨论】:

  • 我进入该地区后开始传输。在那种情况下,它应该调用..对吗?一旦我通过停止传输退出该区域,然后我再次开始传输,它按预期工作(didEnterRegion 被调用)。
  • 是否认为你进入了该地区并不重要。 :) 重要的是 iOS LocationManager 的想法,它的当前状态对您是不可见的。你需要 100% 确定它不认为它已经在你开始监控时定义的 Region 中,因为如果它认为它已经在该 Region 中,你可能不会收到回调。这就是为什么我建议使用上述程序的原因——它可以确保 iOS 在测试开始时将您识别为在该区域之外。
  • 让我换个方式问...如果您报告的问题是可重复的,那么您在评论中所说的有效与您在原始帖子中所说的无效之间有什么区别?你重启手机了吗?你会等待额外的时间吗?重复失败需要什么?
  • @davidgyoung 我的 didEnterRegion 代表没有被调用?你能告诉我如何检测我哪里出错了吗?
  • 我遇到了同样的问题,我发现从 iOS8 开始我们必须处理 requestAlwaysAuthorization 或 requestWhenInUseAuthorization 来获取位置信息。我们还必须将 NSLocationAlwaysUsageDescription 或 NSLocationWhenInUseUsageDescription 添加到 info.plist。
【解决方案2】:

检查您的方法是否以下列方式实现。 在viewDidLoad,最后开始监控

self.beaconRegion.notifyOnEntry=YES;
self.beaconRegion.notifyOnExit=YES;
self.beaconRegion.notifyEntryStateOnDisplay=YES;
[self.locationManager startMonitoringForRegion:self.beaconRegion];

监控开始后,请求您定义区域的状态

- (void) locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region
{
    [self.locationManager requestStateForRegion:self.beaconRegion];
}

状态确定后,开始测距信标

-(void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region
{
    if (state == CLRegionStateInside)
    {
        //Start Ranging
        [manager startRangingBeaconsInRegion:self.beaconRegion];
    }
    else
    {
        //Stop Ranging here
    }
}

并根据您的需要实现以下方法...

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
    self.statusLbl.text=@"Entered region";
}

-(void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
{
    self.statusLbl.text=@"Exited region";
}

-(void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region
{
    if(beacons.count>0)
    {}
}

希望这能解决您的问题。

【讨论】:

  • 惊人的解释。非常感谢。
  • didEnterRegion: 上,我们不应该再次分配 CLLocationManager 吗?因为电话可能来自后台。
  • 要记住的一点是,应用程序的位置权限必须设置为始终,即使您从前台调用此方法!!!
  • 不调用进入区和退出区
【解决方案3】:
before starting coding in project , you must follow given setup guidlines -->
1. in project info or info.plist -->
         Custom IOS Target Properties -->
                    . add "Required background modes"
                    . in this add two items -->
                                ."App shares data using CoreBluetooth"
                                ."App registers for location updates"
2. in project Capability -->
         There is Background Modes  
                   . check "Loaction update"  
                   . check "Acts as a Bluetooth LE accessory"
                   . check "uses bluetooth LE accessories"

(请务必按照 Davidgyoung 先生的指示进行操作。相信我,它一定会奏效的。)

【讨论】:

  • 如果您的应用是 BLE 中心,您需要在所需的后台模式中设置“应用使用 CoreBluetooth 进行通信”。如果您的应用是 BLE 外设,您需要设置“应用使用 CoreBluetooth 共享数据”
  • 我已经添加了每一个然后我仍然没有进入未调用的区域方法
【解决方案4】:

您还需要注意您正在监控一个区域 - 而不是特定的信标。

因此,如果您有 3 个信标共享相同的 proximityUUID,并且您的区域仅定义为 proximityUUID(没有主要和次要值),您只会在两种情况下收到通知:

  1. 范围内没有来自该区域的信标,第一个信标/信标获得 发现 (didEnterRegion:)

  2. 该地区的一个或多个信标在范围内,它们都消失了 约 30 秒 (didExitRegion:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    相关资源
    最近更新 更多