-
-
Save dereknelson/97c6cb5e6ae36ef3c8668f670b4c3c2d to your computer and use it in GitHub Desktop.
import { Permissions, Location, TaskManager, Notifications } from 'expo' | |
import axios from 'axios' | |
export const BACKGROUND_LOCATION_UPDATES_TASK = 'background-location-updates' | |
export const BACKGROUND_GEOFENCING_UPDATES_TASK = 'background-geofencing-updates' | |
const geofences = [] //I get this from the server, omitted for sake of clarity | |
const url = 'api.metoo.io' | |
TaskManager.defineTask(BACKGROUND_LOCATION_UPDATES_TASK, handleLocationUpdate) | |
TaskManager.defineTask(BACKGROUND_GEOFENCING_UPDATES_TASK, handleGeofencingUpdate) | |
export async function initializeBackgroundLocationTasks(){ | |
try { | |
await Permissions.askAsync(Permissions.LOCATION) | |
let isBGLRegistered = await TaskManager.isTaskRegisteredAsync(BACKGROUND_LOCATION_UPDATES_TASK) | |
if (!isBGLRegistered) await Location.startLocationUpdatesAsync(BACKGROUND_LOCATION_UPDATES_TASK, { | |
accuracy: Location.Accuracy.High, timeInterval: 5000, distanceInterval: 10, | |
}) | |
let isGeofencingRegistered = await TaskManager.isTaskRegisteredAsync(BACKGROUND_GEOFENCING_UPDATES_TASK) | |
if (!isGeofencingRegistered) await Location.startGeofencingAsync(BACKGROUND_GEOFENCING_UPDATES_TASK, geofences) | |
return true | |
} catch (error) { | |
return false | |
} | |
} | |
export async function handleLocationUpdate({ data, error }) { | |
if (error) return | |
const username = await AsyncStorage.getItem('username') | |
if (data) { | |
try { | |
const { locations } = data | |
const res = await axios.get(`${url}/${__DEV__ ? 'dev/' : ''}userlocation/${username}/${JSON.stringify(locations[0].coords)}`) | |
} catch (error) { | |
console.log('location update error',error) | |
} | |
} | |
} | |
export async function handleGeofencingUpdate({ data: { eventType, region }, error }) { | |
if (error) return | |
const username = await AsyncStorage.getItem('username') | |
const url = eventType == Location.GeofencingEventType.Enter ? 'entered' : 'exited' | |
try { | |
// const response = await metooApi.sendLocation({ link: JSON.stringify(region), token }) | |
const response = await axios.get(siccurl(`${url}/${__DEV__ ? 'dev/' : ''}geofence/${username}/${url}/${JSON.stringify(region)}`)) | |
const body = eventType === Location.GeofencingEventType.Enter ? 'Entered region' : 'Exited region' | |
Notifications.presentLocalNotificationAsync({ title: '', body, ios: { sound: true } }) | |
} catch (error) { | |
console.log('geofence error',error) | |
} | |
} |
Hi @dereknelson thank you for your replay.
I checked what you offered but it still not work, it work me with/without your suggestion the same in expo client both background/froeground and killed mode.
But on standalone app it works just on background/foreground, in killed mode it just don't work on standalone app.
I log each location update, I get the location updated in killed mode but the access token is null.
What else am I missing ?
thanks.
@niv-breez hmm I never got it to work at all in the background (meaning quit, and re-awakened by the OS for a location update) on a standalone so I can't help you there, this is getting beyond my level of expertise. I see you opened an issue with the expo team, that's probably next best thing you can do. Good luck!
@niv-breez Yes it worked, specifically in your example you have to define the task as an async one:
However for different reasons I could never get expo's background tasks to run in the standalone app, only the client one.