Background Geolocation
A Capacitor plugin which lets you receive geolocation updates even while the app is backgrounded. Only iOS and Android platforms are supported.
Usage
import {registerPlugin} from "@capacitor/core";
const BackgroundGeolocation = registerPlugin("BackgroundGeolocation");
BackgroundGeolocation.addWatcher(
{
backgroundMessage: "Cancel to prevent battery drain.",
backgroundTitle: "Tracking You.",
requestPermissions: true,
stale: false,
distanceFilter: 50
},
function callback(location, error) {
if (error) {
if (error.code === "NOT_AUTHORIZED") {
if (window.confirm(
"This app needs your location, " +
"but does not have permission.\n\n" +
"Open settings now?"
)) {
BackgroundGeolocation.openSettings();
}
}
return console.error(error);
}
return console.log(location);
}
).then(function after_the_watcher_has_been_added(watcher_id) {
BackgroundGeolocation.removeWatcher({
id: watcher_id
});
});
{
longitude: 131.723423719132,
latitude: -22.40106297456,
accuracy: 11,
altitude: 65,
altitudeAccuracy: 4,
bearing: 159.60000610351562,
speed: 23.51068878173828,
time: 1562731602000
}
function guess_location(callback, timeout) {
let last_location;
BackgroundGeolocation.addWatcher(
{
requestPermissions: false,
stale: true
},
function (location) {
last_location = location || undefined;
}
).then(function (id) {
setTimeout(function () {
callback(last_location);
Plugins.BackgroundGeolocation.removeWatcher({id});
}, timeout);
});
}
Typescript support
import {BackgroundGeolocationPlugin} from "@capacitor-community/background-geolocation";
const BackgroundGeolocation = registerPlugin<BackgroundGeolocationPlugin>("BackgroundGeolocation");
Installation
Different versions of the plugin support different versions of Capacitor:
Capacitor | Plugin |
---|
v2 | v0.3 |
v3 | v1 |
Read the documentation for v0.3 here.
npm install @capacitor-community/background-geolocation
npx cap update
iOS
Add the following keys to Info.plist.
:
<dict>
...
<key>NSLocationWhenInUseUsageDescription</key>
<string>We need to track your location</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>We need to track your location while your device is locked.</string>
<key>UIBackgroundModes</key>
<array>
<string>location</string>
</array>
...
</dict>
Android
Configure AndroidManifest.xml
:
<manifest>
<application>
<service
android:name="com.equimaps.capacitor_background_geolocation.BackgroundGeolocationService"
android:enabled="true"
android:exported="true"
android:foregroundServiceType="location" />
</application>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-feature android:name="android.hardware.location.gps" />
</manifest>
Configration specific to Android can be made in strings.xml
:
<resources>
<string name="capacitor_background_geolocation_notification_channel_name">
Background Tracking
</string>
<string name="capacitor_background_geolocation_notification_icon">
drawable/ic_tracking
</string>
</resources>
Changelog
v1.0.0
- BREAKING:
addWatcher
now returns a Promise which resolves to the callback ID, rather than the callback ID itself. - BREAKING: The plugin is imported via Capacitor's
registerPlugin
function, rather than from the Plugins
object. - BREAKING: Drops support for iOS v11 and Capacitor v2.
- Adds support for Capacitor v3.