2020-02-18T14:32:18+09:00

System Events を使わずに AppleScript から GUI Scripting が使用可能か調べる

OS X 10.10 から導入された JXA (JavaScript for Automation) を使って、System Events を使わずに、GUI Scripting が使用可能かどうか調べて、使用不可だったらダイアログを出すスクリプトを紹介します。オーソドックスに AppleScript を使うより、随分コードが短くなります。

AppleScript から GUI Scripting を使用可能かどうか調べるには、次のような感じで System Events に問い合わせるのが、普通ですね。

tell application id "com.apple.SystemEvents"
return UI elements enabled
end tell

そして、もし false が帰ってきたら、ダイアログを表示して、システム環境設定の「セキュリティーとプライバシー」の「プライバシー」タブの「アクセッシビリティー」で設定するように促しますね。

この一連の流れを行う AppleScript ライブラリ GUIScriptingChecker を開発/公開しています。

これはこれで良いのですが、macOS 10.14 から最初に Apple Event を送る際に、承認を求められるようになりました。つまり、GUI Scripting をチェックする際にいちいち System Events への Apple Event の送信を承認しなきゃいけない。うっとおしいですね。

C 言語の API を使うことができれば、Apple Event を送信せずに GUI Scripting が使用可能かチェックできます。AppleScript は C の API にアクセスできませんが、OS X 10.10 から 導入された (JXA) JavaScript for Automation では、それができます。そこで、次のように run script で JXA を実行します。

on check_GUIScripting()
run script "ObjC.import('Carbon');
ObjC.import('Cocoa');
const opt = $.NSDictionary.dictionaryWithObjectForKey(true, $.kAXTrustedCheckOptionPrompt);
$.AXIsProcessTrustedWithOptions(opt);" in "JavaScript"
end check_GUIScripting

check_GUIScripting()

この方法の何が良いって、次のように OS 側が用意している GUI Scripting の設定を促すダイアログを表示してくれることです。

わざわざ自分でダイアログを表示するコードを書く手間が省けます。

AppleScripter としては、JXA の利用は負けた気がしますが、C の API を実行できる機能には抗えません。