Skip to content

BWMuller/background_location

 
 

Repository files navigation

Background Location

Forked from Almoullim and published separately due to slow maintenance and support

A Flutter plugin to get location updates in the background for both Android and iOS (Requires iOS 10.0+). Uses CoreLocation for iOS and FusedLocationProvider for Android

Getting Started

1: Add this to your pubspec.yaml file:

dependencies:
  background_location_2: ^0.16.0

2: Install packages from the command line:

flutter pub get

Alternatively, your editor might support flutter packages get. Check the docs for your editor to learn more.

Configuration

For using background_location package you need to add permissions to use location service. Add these permissions to your platform.

iOS Platform Permission

in ios/Runner/Info.plist add:

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>[Describe your purpose for using this permission]</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>[Describe your purpose for using this permission]</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>[Describe your purpose for using this permission]</string>
<key>UIBackgroundModes</key>
<array>
    <string>fetch</string>
    <string>location</string>
</array>

Note: You need to describe your purpose for using the permission in to string value. If not, attempts to access the resource fail, and might even cause your app to crash. And when publishing to the App Store, this can cause your app to be rejected by Apple. Refer to Provide a purpose string (Apple Documentation).

Android Platform Permission

In android/app/src/main/AndroidManifest.xml add:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/> 

How to use

Import the package where you want to use it.

import 'package:background_location_2/background_location.dart';

Request permissions from the user. You can use permission_handler for this.

Set the notification title, message and icon (Android only). Use await or .then if you want to start the location service immediately after because it's an asynchronous method

BackgroundLocation.setAndroidNotification(
  title: "Notification title",
  message: "Notification message",
  icon: "@mipmap/ic_launcher",
);

Set the interval between localisations in milliseconds (Android only). Use await or .then if you want to start the location service immediately after because it's an asynchronous method

BackgroundLocation.setAndroidConfiguration(1000);

Start the location service. This will also ask the user for permission if not asked previously by another package.

// To ensure that previously started services have been stopped, if desired
BackgroundLocation.stopLocationService();

// Then start the service
BackgroundLocation.startLocationService();

Note: There is currently an open issue (#10) where, if the location service is started multiple times, the location callback will get called repeatedly. This can be worked around by calling BackgroundLocation.stopLocationService(); to stop any previous running services (such as from a previous run of the app) before starting a new one.

Start location service by specifying distanceFilter. Defaults to 0 if not specified

BackgroundLocation.startLocationService(distanceFilter : 10);

You can also force the use of Android LocationManager instead of Google's FusedLocationProvider by setting the forceAndroidLocationManager property to true. If not specified, this defaults to false, which uses FusedLocationProvider if it is available, treating LocationManager as a fallback. This setting has no effect on iOS devices.

BackgroundLocation.startLocationService(forceAndroidLocationManager: true);

getLocationUpdates will trigger whenever the location is updated on the device. Provide a callback function to getLocationUpdates to handle location updates.

BackgroundLocation.getLocationUpdates((location) {
  print(location);
});

location is a Class exposing the following properties.

double latitude;
double longitude;
double altitude;
double bearing;
double accuracy;
double speed;
double time;
bool isMock;

To stop listening to location changes you can execute.

BackgroundLocation.stopLocationService();

About

Flutter background location plugin for Android and iOS

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Kotlin 68.5%
  • Dart 20.3%
  • Swift 7.6%
  • Ruby 3.0%
  • Objective-C 0.6%