flutter_background_geolocation icon indicating copy to clipboard operation
flutter_background_geolocation copied to clipboard

Headless refresh token issue

Open sushrutnaik opened this issue 2 years ago • 7 comments

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

sushrutnaik avatar Jan 09 '23 09:01 sushrutnaik

it is giving error

Why not post that error here?

christocracy avatar Jan 09 '23 10:01 christocracy

[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]

sushrutnaik avatar Jan 09 '23 11:01 sushrutnaik

I don’t think you’re using verbose logging. See wiki Debugging.

christocracy avatar Jan 09 '23 11:01 christocracy

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]]

sushrutnaik avatar Jan 09 '23 12:01 sushrutnaik

See api docs Config.logLevel

christocracy avatar Jan 09 '23 12:01 christocracy

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

sushrutnaik avatar Jan 10 '23 12:01 sushrutnaik

See wiki Debugging and learn how to fetch plugin logs with .emailLog method.

christocracy avatar Jan 10 '23 14:01 christocracy

This issue is stale because it has been open for 30 days with no activity.

github-actions[bot] avatar May 21 '24 01:05 github-actions[bot]

This issue was closed because it has been inactive for 14 days since being marked as stale.

github-actions[bot] avatar Jun 04 '24 01:06 github-actions[bot]