Самый быстрый способ программно открыть preppane? - PullRequest
7 голосов
/ 18 ноября 2009

AppleScript был слишком медленным, поэтому я попробовал ScriptingBridge, чтобы открыть System Preferences.app и установить текущую панель, которая также слишком медленная. Есть ли более быстрый способ сделать это? правильно

Ответы [ 4 ]

9 голосов
/ 15 июня 2016

Более прямой метод, чем использование пути к файловой системе, заключается в использовании соответствующего URL-адреса ресурса для панели предпочтений в NSWorkspace, как показано:

NSString *urlString = @"x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility";
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:urlString]];

, где urlString было взято из списка некоторых возможных строк URL https://macosxautomation.com/system-prefs-links.html

5 голосов
/ 18 ноября 2009

Используйте Launch Services или NSWorkspace, чтобы открыть пакет prefpane. Это программная версия команды open (1).

5 голосов
/ 18 ноября 2009

ежу понятно:

system("open -a System\\ Preferences");

И выбрать, какую панель открыть:

open /System/Library/PreferencePanes/Internet.prefPane
open /System/Library/PreferencePanes/DateAndTime.prefPane
...

При условии, что вы с небольшой пробой и ошибкой нашли нужный файл в /System/Library/PreferencePanes/ сначала.

Я уверен, что есть еще какао способ сделать этот последний трюк, все же ... этот работает с каждым языком.

Также: Вы можете проверить эти пути

/Library/PreferencePanes/
~/Library/PreferencePanes/

... так как именно здесь сторонние приложения устанавливают свои *.prefPane файлы

0 голосов
/ 18 ноября 2009

Как именно вы использовали Скриптовый мост?

Я пытался с этим кодом, и я думаю, что он работает достаточно хорошо:

SystemPreferencesApplication *SystemPreferences = [SBApplication applicationWithBundleIdentifier:@"com.apple.systempreferences"];
@try {
    [SystemPreferences activate];
    SystemPreferences.currentPane = [SystemPreferences.panes objectWithID:@"com.apple.preference.security"];
} @catch (NSException *exception) {
    NSLog(@"%@", [exception description]);
}

Вот еще один вариант для развлечения - Какао, но совсем не задокументированный (и работает только с панелями системных настроек). Вы можете использовать его для сравнения производительности, но не используйте его в производственном коде.

id bezelServicesTask = [NSConnection rootProxyForConnectionWithRegisteredName:@"com.apple.BezelServices" host:nil];
[bezelServicesTask performSelector:@selector(launchSystemPreferences:) withObject:@"Security.prefPane"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...