Swift development tips and experiences by Tommi Kivimäki

Browse all notes

Sharing data between an app extension and a containing app in macOS

I was developing a Safari App Extension and needed a way to share data between the containing app and the extension. I needed to pass the user settings, so the extension would behave correctly.

The containing app does not have a direct access to the extension’s properties and vice versa. The sharing can happen through NSUserDefaults.

First I navigated to the containing app’s Project Navigator and selected the main app target. Under the Capabilities tab I toggled on the App Groups. Then I created a new app group: “group.com.bundle-identifier-domain.myapp”.

I added the same app group for app extension target. Now I could finally share the user settings between the containing app and the extension by initializing the userDefaults with the group.

let userDefaults = UserDefaults.init(suiteName: "group.com.bundle-identifier-domain.myapp")

The app group can be created also in the Apple’s Developer Portal under the “Certificates, Identifiers & Profiles” sections.