Opening the Extension menu in the System Preferences

Hi there,

I have two extension in my App, a Finder Sync and a Share Extension. Because these are disabled by default and automatically enabling them is, according to my extensive research, not possible, I want to provide an easy way for the user to enable the extensions when the app is opened. I am currently displaying a popup, with a button to open the preferences. I have struggled with this a bit, by now I managed to open the main preferences window using

NSWorkspace.shared.open(URL(string: "x-apple.systempreferences:com.apple.preference")!)

which is rather suboptimal though, since the user has to select the extensions option manually and isn't directly redirected there.

What I have also found is that the menu of the FinderSyncExtension can be opened directly by using FIFinderSyncController.showExtensionManagementInterface() which is unfortunately suboptimal as well, because it only shows the managment interface of the finder extension and not the overview of all extensions.

Is there any way to either enable the extensions programatically, or if not, is there a way to show the "Added Extensions" portion of the Extensions menu in the system preferences?

Accepted Reply

After searching through some old forum-posts where this problem is also described, I do not think it is possible. If you have multiple extensions you only have two options:

1 - Simply open the preferences (it is not possible to open the Extensions part of the preferences, for some reason) using the following code:

NSWorkspace.shared.open(URL(string: "x-apple.systempreferences:com.apple.preference")!)

You should display some instructions for the user, telling them where and how to enable your extensions (which is what I resulted to)

2- Result to opening only the config of the Finder Sync Extension using:

 FIFinderSyncController.showExtensionManagementInterface()

This is suboptimal though, because the user might only enable one of your extensions.

I really hope that some implementation of opening the extension preferences will be added soon, or that some of the older extension (e.g. Share Extension, in my case) get updated to also include a Controller similar to the FIFinderSyncController of the Finder Sync extension.

Replies

After searching through some old forum-posts where this problem is also described, I do not think it is possible. If you have multiple extensions you only have two options:

1 - Simply open the preferences (it is not possible to open the Extensions part of the preferences, for some reason) using the following code:

NSWorkspace.shared.open(URL(string: "x-apple.systempreferences:com.apple.preference")!)

You should display some instructions for the user, telling them where and how to enable your extensions (which is what I resulted to)

2- Result to opening only the config of the Finder Sync Extension using:

 FIFinderSyncController.showExtensionManagementInterface()

This is suboptimal though, because the user might only enable one of your extensions.

I really hope that some implementation of opening the extension preferences will be added soon, or that some of the older extension (e.g. Share Extension, in my case) get updated to also include a Controller similar to the FIFinderSyncController of the Finder Sync extension.

After some more research, I found that it is actually possible to achieve something like this. Opening the file under /System/Library/PreferencePanes/Extensions.prefPane will open the Extensions Pane at the uppermost level. A way to do this is using the NSWorkspace:

let prefpaneUrl = URL(fileURLWithPath: "/System/Library/PreferencePanes/Extensions.prefPane")
NSWorkspace.shared.open(prefpaneUrl)

Actually there are a quite a bunch of more specific URLs, although undocumented. You can find a list of the ones discovered so far here. You want to use

NSWorkspace.shared.open(URL(string: "x-apple.systempreferences:com.apple.preferences.extensions")!)
// or
NSWorkspace.shared.open(URL(string: "x-apple.systempreferences:com.apple.preferences.extensions?Share")!)

Unfortunately there is no URL publicly known that goes to the page required for finder sync extensions, although Keka has a button to open that page.

In general, URL schemes are not considered API unless explicitly documented. See this post for more of the backstory.

although undocumented

Interestingly [1], the x-apple.systempreferences URL scheme is documented, although obscurely. Check out the info in <EndpointSecurity/ESClient.h>.

Share and Enjoy

Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"

[1] And this was very surprising to me, to the point that I checked internally as to whether it was a mistake or not; it’s definitely kosher.