AppIntentTimelineProvider "func timeline(for" is called twice after a widget button triggers an AppIntent Perform

I'm adding widget interactivity to my home screen widgets via buttons and AppIntents, but running into some interesting behavior the way the timeline is reloaded after.

I'm following this guide from Apple https://developer.apple.com/documentation/widgetkit/adding-interactivity-to-widgets-and-live-activities

And the widget is guaranteed to be reloaded when a button pressed with an intent, But whenever the AppIntent is done with the perform action, the widget timeline is always reloaded twice. It's also interesting to note that both reloads happen after the perform method. If you add a 10 second sleep in the perform, nothing happens for 10 seconds, then both reloads happen.

This issue with this is 2-fold.

  1. calculating and rendering the entire widget timeline can be Networking and DB intensive operations, so I would ideally like to avoid doing all the work twice and save the users battery and processing.

  2. The even worse issue, sometimes data on the server changes in between the split second duplicate widget timeline reloads, causing the widget to flash one state, then update to another a second later which is not a good user experience.

I have a sample project which shows the issue and is very easy to reproduce.

The widget simply keeps track of the number of reloads. To reproduce:

  1. Add the widget to the homescreen
  2. Press the refresh button, and observe the timeline refresh count always goes up by 2.

I've filed a Feedback and attached the sample project and screen recording for anyone to reproduce. FB15595835

We will follow up in your bug report.

AppIntentTimelineProvider "func timeline(for" is called twice after a widget button triggers an AppIntent Perform
 
 
Q