flutter_background_geolocation
flutter_background_geolocation copied to clipboard
Headless refresh token issue
Plugin version:4.7.1 Platform: Android OS version:9 Device manufacturer / model:moto Flutter info (flutter doctor): Plugin config:
void backgroundGeolocationHeadlessTask(bg.HeadlessEvent headlessEvent) async {
await SharedPrefs().init();
print('📬 --> $headlessEvent');
switch (headlessEvent.name) {
case bg.Event.BOOT:
bg.State state = await bg.BackgroundGeolocation.state;
print("📬 didDeviceReboot: ${state.didDeviceReboot}");
break;
case bg.Event.TERMINATE:
try {
bg.Location location =
await bg.BackgroundGeolocation.getCurrentPosition(samples: 1);
print("[getCurrentPosition] Headless: $location");
} catch (error) {
print("[getCurrentPosition] Headless ERROR: $error");
}
break;
case bg.Event.HEARTBEAT:
// DISABLED getCurrentPosition on heartbeat
try {
bg.Location location = await bg.BackgroundGeolocation.getCurrentPosition(samples: 1);
print('[getCurrentPosition] Headless: $location');
} catch (error) {
print('[getCurrentPosition] Headless ERROR: $error');
}
//*/
break;
case bg.Event.LOCATION:
bg.Location location = headlessEvent.event;
print(location);
break;
case bg.Event.MOTIONCHANGE:
bg.Location location = headlessEvent.event;
print(location);
break;
case bg.Event.GEOFENCE:
bg.GeofenceEvent geofenceEvent = headlessEvent.event;
try {
bg.Location location = await bg.BackgroundGeolocation.getCurrentPosition(samples: 1);
print('[getCurrentPosition] Headless: $location');
} catch (error) {
print('[getCurrentPosition] Headless ERROR: $error');
}
print(geofenceEvent);
break;
case bg.Event.GEOFENCESCHANGE:
bg.GeofencesChangeEvent event = headlessEvent.event;
try {
bg.Location location = await bg.BackgroundGeolocation.getCurrentPosition(samples: 1);
print('[getCurrentPosition] Headless: $location');
} catch (error) {
print('[getCurrentPosition] Headless ERROR: $error');
}
print(event);
break;
case bg.Event.SCHEDULE:
bg.State state = headlessEvent.event;
print(state);
break;
case bg.Event.ACTIVITYCHANGE:
bg.ActivityChangeEvent event = headlessEvent.event;
print(event);
break;
case bg.Event.HTTP:
bg.HttpEvent response = headlessEvent.event;
print(response);
break;
case bg.Event.POWERSAVECHANGE:
bool enabled = headlessEvent.event;
print(enabled);
break;
case bg.Event.CONNECTIVITYCHANGE:
bg.ConnectivityChangeEvent event = headlessEvent.event;
print(event);
break;
case bg.Event.ENABLEDCHANGE:
bool enabled = headlessEvent.event;
print(enabled);
break;
case bg.Event.AUTHORIZATION:
bg.AuthorizationEvent event = headlessEvent.event;
print(event);
print("refresh api start");
bg.BackgroundGeolocation.setConfig(
bg.Config(url: "/locations/test",
authorization: bg.Authorization(
strategy: "JWT",
accessToken: SharedPrefs().getAccessToken(),
refreshToken: SharedPrefs().getRefreshToken(),
refreshUrl: "/refresh-token",
refreshPayload: {
"token ":SharedPrefs().getRefreshToken()
},
)
));
print("refresh api end");
break;
}
}
How do I configure refresh token in headless state it is giving error
it is giving error
Why not post that error here?
[HttpEvent {success: false, status: 401, responseText: }] I/flutter (13110): 📬 --> [HeadlessEvent name: authorization, event: [AuthorizationEvent success=false, error=End of input at character 0 of , response=null]] I/flutter (13110): [AuthorizationEvent success=false, error=End of input at character 0 of , response=null]
I don’t think you’re using verbose logging. See wiki Debugging.
void backgroundGeolocationHeadlessTask(bg.HeadlessEvent headlessEvent) async {
await SharedPrefs().init();
print('📬 --> $headlessEvent');
switch (headlessEvent.name) {
case bg.Event.BOOT:
bg.State state = await bg.BackgroundGeolocation.state;
print("📬 didDeviceReboot: ${state.didDeviceReboot}");
break;
case bg.Event.TERMINATE:
try {
bg.Location location =
await bg.BackgroundGeolocation.getCurrentPosition(samples: 1);
print("[getCurrentPosition] Headless: $location");
} catch (error) {
print("[getCurrentPosition] Headless ERROR: $error");
}
break;
case bg.Event.HEARTBEAT:
// DISABLED getCurrentPosition on heartbeat
try {
bg.Location location = await bg.BackgroundGeolocation.getCurrentPosition(samples: 1);
print('[getCurrentPosition] Headless: $location');
print(SharedPrefs().getRefreshToken().toString());
} catch (error) {
print('[getCurrentPosition] Headless ERROR: $error');
}
//*/
break;
case bg.Event.LOCATION:
bg.Location location = headlessEvent.event;
print(location);
break;
case bg.Event.MOTIONCHANGE:
bg.Location location = headlessEvent.event;
print(location);
break;
case bg.Event.GEOFENCE:
bg.GeofenceEvent geofenceEvent = headlessEvent.event;
try {
bg.Location location = await bg.BackgroundGeolocation.getCurrentPosition(samples: 1);
print('[getCurrentPosition] Headless: $location');
} catch (error) {
print('[getCurrentPosition] Headless ERROR: $error');
}
print(geofenceEvent);
break;
case bg.Event.GEOFENCESCHANGE:
bg.GeofencesChangeEvent event = headlessEvent.event;
try {
bg.Location location = await bg.BackgroundGeolocation.getCurrentPosition(samples: 1);
print('[getCurrentPosition] Headless: $location');
} catch (error) {
print('[getCurrentPosition] Headless ERROR: $error');
}
print(event);
break;
case bg.Event.SCHEDULE:
bg.State state = headlessEvent.event;
print(state);
break;
case bg.Event.ACTIVITYCHANGE:
bg.ActivityChangeEvent event = headlessEvent.event;
print(event);
break;
case bg.Event.HTTP:
bg.HttpEvent response = headlessEvent.event;
print(response);
break;
case bg.Event.POWERSAVECHANGE:
bool enabled = headlessEvent.event;
print(enabled);
break;
case bg.Event.CONNECTIVITYCHANGE:
bg.ConnectivityChangeEvent event = headlessEvent.event;
print(event);
break;
case bg.Event.ENABLEDCHANGE:
bool enabled = headlessEvent.event;
print(enabled);
break;
case bg.Event.AUTHORIZATION:
bg.AuthorizationEvent event = headlessEvent.event;
print(event);
print("refresh api start");
bg.BackgroundGeolocation.setConfig(
bg.Config(url: "https://eglocationpre.easygas.co.in/api/v1/locations/test",
authorization: bg.Authorization(
strategy: "JWT",
accessToken: SharedPrefs().getAccessToken().toString(),
refreshToken: SharedPrefs().getRefreshToken().toString(),
refreshUrl: "/refresh-token",
refreshPayload: {
"token ":"{"+SharedPrefs().getRefreshToken().toString()+"}"
},
),
logLevel: Config.LOG_LEVEL_VERBOSE,
));
print(SharedPrefs().getRefreshToken().toString());
print("refresh api end");
break;
}
}
I am using verbose logging and this is the log
📬 --> [HeadlessEvent name: location, event: [Location {is_moving: true, uuid: 0486a48f-3751-44c8-bfa7-d6c3fca3134a, timestamp: 2023-01-09T12:11:23.972Z, odometer: 0, coords: {latitude: 15.8314104, longitude: 74.5049737, accuracy: 20, speed: -1, speed_accuracy: -1, heading: -1, heading_accuracy: -1, altitude: 684.9, ellipsoidal_altitude: 684.9, altitude_accuracy: 1}, activity: {type: still, confidence: 100}, battery: {is_charging: true, level: 1}, extras: {tenantId: 1, source: 1, vehicleId: 1}}]] I/flutter (31647): [Location {is_moving: true, uuid: 0486a48f-3751-44c8-bfa7-d6c3fca3134a, timestamp: 2023-01-09T12:11:23.972Z, odometer: 0, coords: {latitude: 15.8314104, longitude: 74.5049737, accuracy: 20, speed: -1, speed_accuracy: -1, heading: -1, heading_accuracy: -1, altitude: 684.9, ellipsoidal_altitude: 684.9, altitude_accuracy: 1}, activity: {type: still, confidence: 100}, battery: {is_charging: true, level: 1}, extras: {tenantId: 1, source: 1, vehicleId: 1}}] I/flutter (31647): 📬 --> [HeadlessEvent name: http, event: [HttpEvent {success: false, status: 401, responseText: }]] I/flutter (31647): [HttpEvent {success: false, status: 401, responseText: }] I/flutter (31647): 📬 --> [HeadlessEvent name: authorization, event: [AuthorizationEvent success=false, error=End of input at character 0 of , response=null]]
See api docs Config.logLevel
bg.BackgroundGeolocation.onHeartbeat((bg.HeartbeatEvent event) {
print('[onHeartbeat] ${event}');
// You could request a new location if you wish.
bg.BackgroundGeolocation.getCurrentPosition(
samples: 1,
persist: true
).then((bg.Location location) {
if(SharedPrefs().getIsLoggedIn()==true){
bg.BackgroundGeolocation.ready(bg.Config(
url: "/Locations/test",
authorization: bg.Authorization(
strategy: "JWT",
accessToken: SharedPrefs().getAccessToken(),
refreshToken: SharedPrefs().getRefreshToken(),
refreshUrl: "/refresh-token",
refreshPayload: {
"token":SharedPrefs().getRefreshToken()
},
expires:30,
),
extras: {
"source": 1,
"tenantId": 1,
"vehicleId": userController.user.value!.vehicleId!,
},
desiredAccuracy: bg.Config.DESIRED_ACCURACY_HIGH,
distanceFilter: 10.0,
stopOnTerminate: false,
startOnBoot: true,
debug: true,
isMoving: true,
heartbeatInterval: 60,
locationUpdateInterval: 60000,
fastestLocationUpdateInterval: 30000,
enableHeadless: true,
autoSync: true,
// transistorAuthorizationToken: token,
backgroundPermissionRationale: bg.PermissionRationale(
title:
"Allow Motor MotorMouth to access this device's location even when the app is closed or not in use.",
message:
"This app collects location data to enable recording your trips and calculate distance-travelled.",
positiveAction: 'Change to "{backgroundPermissionOptionLabel}"',
negativeAction: 'Cancel'),
logLevel: bg.Config.LOG_LEVEL_VERBOSE
)).then((bg.State state) {
if (!state.enabled) {
//
//3. Start the plugin.
bg.BackgroundGeolocation.start();
}
});
}
});
});
I am using this inside heartbeat but the refreshurl is not getting called in backend is there something more to be done
See wiki Debugging and learn how to fetch plugin logs with .emailLog method.
This issue is stale because it has been open for 30 days with no activity.
This issue was closed because it has been inactive for 14 days since being marked as stale.