Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

locationManager:didEnterRegion not called when a beacon is detected

While testing with beacons (iOS devices) I found the listener beacon giving some unexpected behavior. locationManager:didEnterRegion method is not getting called even if a beacon enters a region. But the locationManager:didRangeBeacons:inRegion: is getting called correctly, and detected beacons are shown there. Has anyone experienced anything like this.

like image 977
Dhanesh KM Avatar asked Oct 08 '13 11:10

Dhanesh KM


4 Answers

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.

like image 154
Muhammad Ibrahim Avatar answered Oct 22 '22 19:10

Muhammad Ibrahim


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.)

like image 37
Nitesh Avatar answered Oct 22 '22 20:10

Nitesh


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:)

like image 40
Maciek Czarnik Avatar answered Oct 22 '22 21:10

Maciek Czarnik


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.

like image 39
davidgyoung Avatar answered Oct 22 '22 20:10

davidgyoung