Luciano LB
Luciano LB

Reputation: 53

iBeacon Monitoring with Unreliable Results (didEnterRegion & didExitRegion)

I'm currently working on an iOS app that ranges and monitors an iBeacon in order to be able to do some actions and receive notifications. Ranging is working flawlessly, but I'm having troubles with the beacon monitoring and the notifications. I've researched quite a bit about the subject and I'm aware that CoreLocation framework has usually problems like this, but I was wondering how other devs are fixing/approaching this.

Basically, I'm showing local notifications when didEnterRegion and didExitRegion methods are fired. Unfortunately, these two methods are being fired quite often (in an unreliable fashion), even when the iBeacon is right next to it, although sometimes is works perfectly, which makes it more annoying. I've tried lowering the iBeacon advertising interval, and although it helped, it didn't fix the issue completely. Now, I'm trying with a logic filter where I ignore firing the notification if the enter or exit event happened in the last X minutes (I'm thinking of a 'magic' number between 5 and 15).

Is anyone having the same problems? Would adding a 2nd iBeacon to the situation help? (maybe monitor both of them, and filter logically the exit and enter events based on those two inputs?). I was also thinking in adding another layer of data to show notifications, maybe based on GPS or Wifi info. Has anyone tried this?

Any other idea? I'm open to any recommendation.

Just in case, I'm using Estimote iBeacons and iOS9 (Objective-c).

Thanks for your time!

Upvotes: 3

Views: 469

Answers (2)

arc4randall
arc4randall

Reputation: 3293

Beacons emit a pulsing signal. Ranging also performs an intermittent scan (roughly every 100 ms). This means that it is possible for your device to miss beacon for a few seconds in a row, which can cause the results you are experiencing. You can log the beacons RSSI value in this method:

- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)iBeacons inRegion:(CLBeaconRegion *)region

I believe you will see a lot of zero values before seeing didExitRegion being called. This isn't a fault in your code, or with the beacon. This just has to do with the fact that neither the signal being emitted or the detection are constant. They are pulsing. These problems can occur while the beacon is just sitting on the same desk as your device, and can be exaggerated in a real world setting when the signals are blocked by physical objects and people.

I would use ranging to determine more accurately if your beacon is around. Note that ranging, especially in the background can have a significant battery draw.

Upvotes: 1

davidgyoung
davidgyoung

Reputation: 64916

Intermittent region exit/entry events are a common problem, and are typically solved with a timer-baded software filter exactly as you suggest. The specifics of how you set up the filter (the minimum time to wait for a re-entry after an exit before processing exit logic) varies for each use case so it is good to have it under your control.

Understand that region exits are caused by iOS not detecting any Bluetooth advertisements from a beacon in the CLBeaconRegion for 30 seconds. If two detected packets are 31 seconds apart, you will get a region exit and then a region entry one second later.

This commonly happens with low signal levels. If an iOS device is on the outer edge of the beacon's transmission range, only a small percentage of packets will be received. With a beacon transmitting at 1Hz, if 30 packets in a row are missed, the iOS device will get an exit event.

There are several things you can do to reduce this problem in a specific area where you want solid coverage:

  1. Turn your beacon transmitter power up to the maximum. This will give stronger signal levels and fewer missed packets in the area you care about.

  2. Turn the advertising rate to the maximum. Advertising at 10 Hz gives 10x as many packets to receive as 1 Hz.

  3. If needed add additional beacons with the same identifier to increase coverage.

Of course, there are costs to the above, including reduced battery life at high advertising rates and transmitter power levels.

Even if you do all of the above, you still need the software filter, because there will always be a point where you are on the edge if the nearest beacon's transmission radius.

You can see an example of software filter code in my answer here.

Upvotes: 2

Related Questions