flutter-plugins icon indicating copy to clipboard operation
flutter-plugins copied to clipboard

[health 3.4.4] No new data on subsequent queries

Open Parfyonator opened this issue 3 years ago • 7 comments

Remember to specify the plugin name in the title!

Device / Emulator and OS

Please complete the following information for each phone and/or emulator you're experiencing this bug on:

  • Device: iPhone 11
  • OS: iOS 15.4.1

Describe the bug

The fresh and up-to-date data is returned only on the very first query. The subsequent queries return the subset of the very first query: as the time window moves forward the less and less data is left in the returned list.

To Reproduce

// make multiple calls with some time intervals to reproduce
final now = DateTime.now();
final healthData = await HealthFactory().getHealthDataFromTypes(
  now.subtract(Duration(seconds: 120)),
  now,
  [HealthDataType.HEART_RATE]
);
healthData.sort(((HealthDataPoint a, HealthDataPoint b) =>  b.dateTo.compareTo(a.dateTo)));
print(healthData.map((e) => e.value));

Eventually the list becomes empty.

Expected behavior

Get up-to-date data on every query (as it happens on the very first query).

Actual behavior

Subsequent queries eventually result in empty returned list.

Screenshots

If applicable, add screenshots to help explain your problem.

Flutter doctor

Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 2.10.5, on macOS 12.3.1 21E258 darwin-arm, locale
    en-UA)
[✓] Android toolchain - develop for Android devices (Android SDK version
    32.1.0-rc1)
[✓] Xcode - develop for iOS and macOS (Xcode 13.3)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2021.1)
[✓] VS Code (version 1.67.1)
[✓] Connected device (2 available)
    ! Error: Oleksandr’s iPhone is busy: Preparing the watch for development via
      Oleksandr’s iPhone. Xcode will continue when Oleksandr’s iPhone is
      finished. (code -10)
[✓] HTTP Host Availability

• No issues found!

Additional information

Add any other info about the problem here.

Parfyonator avatar May 15 '22 18:05 Parfyonator

Here is an example app that shows the problem: https://github.com/Parfyonator/FlutterHealthTest

The only way to get new portion of data is to collapse the running application and bring it back again.

Additional note: I'm using Apple Watch 7 as a heart beat sensor.

Parfyonator avatar May 19 '22 10:05 Parfyonator

Hey @Parfyonator

I've tested this but I'm unable recreate the issue. Using your example app i seem to get the sliding window correctly with new values I add concurrently. As I didn't have an Apple Watch available, I can't conclude if there is an issue with that, but for now I suggest you test with Health 4.0.0 and check if the issue persists.

Regards, Mads

MadsVSChristensen avatar Jun 03 '22 08:06 MadsVSChristensen

Hello @MadsVSChristensen . I've updated Health package to version 4.0.0. Nothing have changed. I'll try to make a video to show what is happening.

Also I want to share an update: sometimes it gives a new potion of data but the time interval is not consistent (sometimes it is under a minute, sometimes it 2-5 minutes). Maybe that's because Health app on iPhone doesn't get updates from Apple Watch very often. On the other hand, it gives new data after collapsing the app and bringing it back again.

I also tried another package, but faced the same issue. I'm not sure if this task with real-time heart rate reading may be accomplished without a companion app on Apple Watch, so I ended up writing one in Swift that streams heartbeat data from apple watch to my flutter app.

Parfyonator avatar Jun 04 '22 20:06 Parfyonator

Hey @Parfyonator

Thanks for the update. It does seem like the issue might be related to the time interval between updates from the Apple Watch to the Health app. When I tested it, I added data manually (on a button press) which worked as intended. This suggests the issues lies in the update interval.

I was unable to locate any information in the HealthKit documentation about the update interval, but did find an old post about it here. It seems to require starting a "Workout", which you might want to look into.

Hope this helps.

Regards, Mads

MadsVSChristensen avatar Jun 10 '22 08:06 MadsVSChristensen

Hi @MadsVSChristensen

I've already seen that link on apple developer forum. I also found it while was researching the problem. Yes, I was unable to get any HBPM untill starting a workout session. But after starting it manually on my Apple Watch I had the exact behaviour I've described earlier. In the companion app I wrote for my Apple Watch I also had to start workout session in the background in order to get HBPM in real-time, though it works differently than a regular workout session that you start manually: you have to start/pause/stop from your companion app and manage all this controls yourself (this background workout is not available in the standard Apple application).

In the dart package I've mentioned earlier (health_kit_reporter) there is a functionality to start workout session but I didn't manage to start it using it. It doesn't seem to work properly at the moment. But I still will try to make it work. I'm hoping to be able to start background workout session from my flutter app without corresponding companion app on the Apple Watch. If it works out I can share the progress (if you'd like, of course).

Best regards, Oleksandr

Parfyonator avatar Jun 12 '22 08:06 Parfyonator