locationManager:didEnterRegion not called when a beacon is detected

前端 未结 4 411
广开言路
广开言路 2020-12-03 03:45

While testing with beacons (iOS devices) I found the listener beacon giving some unexpected behavior. locationManager:didEnterRegion method is not getting c

相关标签:
4条回答
  • 2020-12-03 03:58
    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"
    

    (and do follow the instructions given by Mr. Davidgyoung. believe me, it will definitely work.)

    0 讨论(0)
  • 2020-12-03 04:06

    Check if your methods are implemented in the following way. In viewDidLoad, start moniotoring at the end

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

    after monitoring start, request state for your defined region

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

    after state is determined, start ranging beacons

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

    and implement the following methods according to your needs...

    - (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)
        {}
    }
    

    Hope this will solve your problem.

    0 讨论(0)
  • 2020-12-03 04:14

    It's hard to say if I have seen the exact same thing without more specifics about the starting conditions of your test. But, yes, in some specific cases, I have seen locationManager:didRangeBeacons:inRegion get called even without getting a call to locationManager:didEnterRegion.

    If you start ranging and monitoring at the same time with the same region, and iOS thinks you were already in the monitored region, then you may not get a call to locationManager:didEnterRegion.

    To truly test if something is amiss, you need to set up a test case where you:

    1. Make sure you are not in the region.
    2. Let iOS run for several minutes
    3. Start monitoring that region
    4. Let iOS continue to run for a few minutes
    5. Enter the region.
    6. See if you get a call to locationManager:didEnterRegion

    If you still don't get a call after going through the above, then something is definitely wrong.

    0 讨论(0)
  • 2020-12-03 04:18

    You also need to be aware that you are monitoring a region - not a particular beacons.

    So if you have 3 beacons which share the same proximityUUID and your region is defined as only proximityUUID (without major and minor values) you will get notified only in two situations:

    1. No beacons from the region were in range and first beacon/beacons gets discovered (didEnterRegion:)

    2. One or more beacons from the region were in range and they all went out of sight for ~30 seconds (didExitRegion:)

    0 讨论(0)
提交回复
热议问题