Sharing UserDefaults between extensions

Viewed 37263

Creating a Today widget and I am using UserDefaults(suiteName:) to persist some data. In the main application I am using UserDefaults.standard(). This can't be read (or can it?) by the extension which is why I use the suiteName: constructor.

Data that user persist to UserDefaults.standard() in the main app needs to be available in the extension.

At this time I am persisting to both so that the values can be shared

 UserDefaults.standard().set:...forKey:...
 UserDefaults(suiteName:...)().set:...forKey:...
 ...

Question is should I drop UserDefaults.standard() all together and just use UserDefaults(suiteName:) in my application, or is this bad practice and if so why?

Edit: I am using an App group container. For clarification I am asking should I just replace standard() with suiteName: throughout my project?

5 Answers

Make sure App Groups is enabled for ALL OF YOUR TARGETS (your app and extensions targets) in the Capabilities tab

enter image description here

And then use the group's identifier above as suite name when create UserDefaults:

let userDefaults = UserDefaults(suiteName: "group.com.YourCompany.YourApp")

Also make sure you add App Groups to the correct Configuration (Debug, Release). If you add App Groups in Debug for your application target and try to use it in Release config for your extension, then it wont work.

If you add in Debug config (for app target), then use it in debug config (for extension target)

Related