17
votes

I have an application where a user can login. If a user is logged in, then I display a placeholder for my widget and it's configurable through an intent extension.

The configuration has two options:

  • the first option depends on the username of the user currently logged in.
  • the second option depends on the value of the first option.

This works fine for 1 user, however, if the user logs out, then logs in with a different account, the old selected options are still selected when they try to configure the widget, which are wrong options since it's now a different user. Also, the old data is still shown in the widget.

How do I reset the configuration of a widget in WidgetKit? Meaning, when the user tries to configure it all the previous configurations would be unselected and empty.

I tried

WidgetCenter.shared.reloadAllTimelines()

But that only reloads the timeline methods but does not reset configurations.

I've looked at Apple's documentations and could not find anything about it either.

Thanks a lot,

3
Have you had any success? I have the same scenario. - Chad Milburn
Unfortunately, no. I thought that maybe Apple would do something about it in their final release of iOS 14 and WidgetKit, but, they have not. If you can up vote the question, please do, so it can get more attention. - K.A.Q
I am facing the same problem, I could not find a solution :( - FarouK
Same issue here, I could not find any solution about it. - Alihan
I'm having the same problem. One possibility I'm thinking about could be to ignore the selected configuration options within IntentTimelineProvider if we can verify they're stale, and show the default instead. - diegoreymendez

3 Answers

2
votes

You cant. the only option you have is to ignore the configuration option on the widget side and show some kind of error message to the user that their config needs to be updated. INExtension does not provide a way to handle this (yet)

-1
votes

I had the same issue that the widget was showing stale configuration options. I solved this by forcefully refreshing all objects in my shared Core Data database which I was using. I did this in the „getTimeline“ method.

-1
votes

I found this solution, but for dynamic properties only: use different identifiers for every user in your IntentHandler. Example:

class IntentHandler: XXExtension { ... }

extension IntentHandler: XXDynamicXXXSelectionIntentHandling {

   func provideXXXOptionsCollection(for intent: XXDynamicXXXSelectionIntent, with completion: @escaping (XXObjectCollection<XXX>?, Error?) -> Void) {
      let userId = (UserDefaults.myGroup().object(forKey: "UserId" ) as? String) ?? ""
      let items: [XXX] = UserDefaults.myGroup().sharedXxx.map { (sharedXxx) -> XXX in
         return XXX(identifier: userId + "_" + sharedXxx.Id // <== add unique prefix ===
                       display: sharedXxx.visibleName())
      }        
      let collection = XXObjectCollection(items: items)
      completion(collection, nil)
   }

}