Ios locationManager:检测到信标时未调用didEnterRegion

Ios locationManager:检测到信标时未调用didEnterRegion,ios,core-location,core-bluetooth,ibeacon,Ios,Core Location,Core Bluetooth,Ibeacon,在使用信标(iOS设备)进行测试时,我发现侦听器信标出现了一些意外行为locationManager:didEnterRegion即使信标进入区域,也不会调用方法。但是,locationManager:didRangeBeacons:inRegion:被正确调用,检测到的信标显示在那里。有没有人经历过类似的事情。如果没有关于测试开始条件的更多细节,很难说我是否见过完全相同的事情。但是,是的,在某些特定情况下,我看到locationManager:didRangeBeacons:inRegion即

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

如果没有关于测试开始条件的更多细节,很难说我是否见过完全相同的事情。但是,是的,在某些特定情况下,我看到locationManager:didRangeBeacons:inRegion即使没有接到locationManager:didEnterRegion的电话也会被呼叫

如果您在同一地区同时开始测距和监控,并且iOS认为您已经在监控地区,那么您可能不会接到locationManager:didEnterRegion的电话

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

  • 确保您不在该地区
  • 让iOS运行几分钟
  • 开始监视那个地区
  • 让iOS继续运行几分钟
  • 输入区域
  • 看看你是否接到locationManager:didEnterRegion的电话

  • 如果在完成上述步骤后仍然没有收到呼叫,那么肯定是出了问题。

    检查您的方法是否按以下方式实现。 在
    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)
        {}
    }
    
    希望这能解决你的问题

    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"
    

    (请务必按照戴维德扬先生的指示进行操作。相信我,这肯定会奏效。)

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

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

  • 该区域没有信标在射程内,第一个信标/信标在射程内 已发现(
    didEnterRegion:

  • 来自该地区的一个或多个信标在射程内,它们都消失在视线之外 约30秒(
    didExitRegion:


  • 我进入该地区后开始传播。如果是那样的话,它应该叫。。正确的?一旦我通过停止传输退出该区域,然后我再次开始传输,其工作正常(会调用didEnterRegion)。如果您认为您已进入该区域,则无所谓。:)重要的是iOS LocationManager的想法,它的当前状态对您来说是不可见的。您需要100%确保它不认为它已经在您开始监视时定义的区域中,因为如果它认为它已经在该区域中,您可能不会收到回调。这就是为什么我建议使用上面的过程——它确保了当测试开始时,iOS会将您识别为在该区域之外。。。如果你报告的问题是可重复的,那么你在评论中所说的有效与在原始帖子中所说的无效之间有什么区别?你重启手机了吗?你会等很长时间吗?需要什么才能重复失败?@davidgyoung我的didEnterRegion代理没有被调用?你能告诉我如何检测我哪里出错了吗?我遇到了同样的问题,我发现从iOS8我们必须处理请求AlwaysAuthorization或RequestWhenUseAuthorization来获取位置信息。此外,在解决问题1,5天后,我们还必须将NSLocationAlwaysUsageDescription或nsLocationWhenUsageDescription添加到info.plist。问题出在飞机模式上。如果飞机模式开启,iBeacon测距功能正常工作,但无法监控。遗憾的是,没有任何错误或令人困惑的解释。非常感谢。在
    dienterregion:
    上,我们是否应该再次分配CLLocationManager?因为调用可能来自后台。需要记住的一点是,应用程序的位置权限必须设置为“始终”,即使您从前台调用此方法!!!输入区域和退出区域不被调用。如果您的应用程序是可移动中心,则需要在所需的后台模式下设置“应用程序使用CoreBooth进行通信”。如果你的应用程序是一个BLE外设,你需要设置“应用程序使用CoreBluetooth共享数据”,我已经添加了每个,然后仍然没有调用我的did输入区域方法