Eagle
Eagle

Reputation: 21

beacon detection in background even though app is closed

Hi i am developing an application with beacons i need to scan for beacons continuously even though app is closed. is there any cordova plugin which is able to run in background, please suggest me sample applications tutorials

Upvotes: 2

Views: 1912

Answers (4)

quilkin
quilkin

Reputation: 1427

Try this plugin for using iBeacons. There seem to be a few plugins for keeping apps running in the background, e.g. this one. I doubt you'll find both functions in the same plugin.

Upvotes: 0

davidgyoung
davidgyoung

Reputation: 64941

This is possible with native iOS code, but not with Cordova. When you say "scan" beacons, this usually means using the CLLocation ranging APIs, which provid updates of all visible beacons every second. In order to do this continuously in the background, you need to:

  1. Add location as a background mode in your app's .plist filke in XCode as @hasan83 suggests.
  2. Start a background thread to keep your app running in the background.
  3. Request requestAlwaysAuthorization as @sloik suggests.

I wrote a tutorial and reference app of how to do this. The tutorial mentions this working only for 3 minutes, but with the background mode of location, the 3 minute restriction goes away. Be aware that adding this background mode may make it more difficult to get your app approved for the AppStore. Apple must approve of the reasons for this background use of location services.

The reason you can't do this with Cordova is because JavaScript must run to collect the beacon data returned by the ranging APIs. This works in the foreground, but not in the background, because Cordova relies on a WebView being in the foreground to execute JavaScript code. In the background, your custom code just cannot run.

Upvotes: 1

sloik
sloik

Reputation: 732

Background modes are only a partial answer. You need to have one of or both entries in Info.plist:

enter image description here

Then in some place in your code you need to ask for requestWhenInUseAuthorization or in your case requestAlwaysAuthorization. Then you need to handle this in location manager delegate. I'm doing it like so:

- (void)locationManager:(CLLocationManager *)manager  didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
    if (status == kCLAuthorizationStatusAuthorizedWhenInUse) {

        [self startMonitoringAllRegions];

        [self.locationManager startUpdatingLocation];
    }
    else if (status == kCLAuthorizationStatusNotDetermined) {
        [self.locationManager requestWhenInUseAuthorization];
    }
}

So somewhere i'm asking to start monitoring for a beacon region then in this method I'm checking if I have permission from the user to do that if not I'm requesting if (the string from the plist will be displayed) if I have I'm starting updating user location.

Hope that will get you going :D

Upvotes: 1

hasan
hasan

Reputation: 24205

Allow UIBackgroundModes for location updates in the project plist file.

Select the project at the left pane, then select Capabilities and expand the Background Modes list and select the Location updates option:

enter image description here

Upvotes: 0

Related Questions