Apple Developper Accountの契約を行い、Xcode上で(他のアプリケーションをコントロールする)AppleScriptアプリケーションを作れるようにしたときに、macOS 10.14+Xcode最新版の10.1だと実際どうなのかをまとめてみました。
Xcode上でこれまでと同様にScriptアプリケーションを記述しただけではダメ
Sandbox対応させると制約事項が増えるため、Sandbox非対応のアプリケーションをビルドしてどこまで行けるかは興味深いところです。
ですが、とりあえず(安全のために)、Code Sign+Sandboxの設定を行ってXcode上でAppleScriptアプリケーションを作成。Keynoteに新規ドキュメントを作成させる程度のお気軽なコードを書き、ビルドして実行。すると、
2019-01-15 99:99:99.999999+0900 1014test[13673:1813575] *** -[AppDelegate applicationWillFinishLaunching:]: Not authorized to send Apple events to Keynote. (error -1743)
などとエラーが出るだけで、AppleScriptからの操作対象アプリケーション(ここではNumbers)は、動かせませんでした。Automationのセキュリティダイアログ自体が表示されない状態です。
▲セキュリティダイアログはこんなやつ
Info.plistにエントリを追加するとSecurityダイアログが表示されるようになる
こういう場合には海外のサイトを調べてみるのが一番手っ取り早いところです。いろいろ調べてみたところ、Info.plistに対して、
Privacy - AppleEvents Sending Usage Description
というエントリを追加する必要があるとのこと。
このInfo.plist上のエントリ、例のMojaveから出るようになったSecurityダイアログにアプリケーション側から出力するカスタムメッセージを定義するエントリのようです。エントリさえ存在すれば、とくに何か気の利いたメッセージを入れる必要はないようです。
英語で書いても、日本語で書いてもそのままダイアログに出力されます。Info.plistの内容自体はローカライズできないので、本エントリの内容は広域に配布するものであれば英語で、特定の日本国内の顧客に向けて納品するものであれば日本語で書けばいいんじゃないでしょうか(一般的なメッセージ同様にローカライズできることが望ましい)。このあたり、ローカライズできないのは仕様的におかしいので、そのうち仕様が変わりそうです、、、、
Securityダイアログを表示させるためには、AppleScriptアプリケーション側から対象のアプリケーションに対して命令を発行する必要があるのですが、これが、activateさせるとかバージョン番号を調べるぐらいのコマンドではそのまま実行されてしまって、セキュリティダイアログは表示されません。
せめて新規ドキュメントを作成(make new document)して破棄(close without saving)するぐらいのことを行わないと、ダメなようです。このあたり、実際に試してみるしかないようです。
■セキュリティダイアログを表示させる程度の意味のない(ウォームアップのための)Scriptサンプル
tell application "Microsoft Excel"
set aDoc to (make new document)
close active workbook without saving
end tell
★Click Here to Open This Script
tell application "Keynote"
set aDoc to (make new document)
close aDoc without saving
end tell
★Click Here to Open This Script
tell application "Finder"
make new Finder window
close Finder window 1
end tell
★Click Here to Open This Script
–Touch Barの有無の検出
on detectTouchBar()
tell application "System Events"
set frontApp to first application process whose frontmost is true
try
set touchBar to first UI element of frontApp whose role is "AXFunctionRowTopLevelElement"
on error errMsg number errNum
return false
end try
set touchBarItems to value of attribute "AXChildren" of touchBar
return (touchBarItems is not equal to {})
end tell
end detectTouchBar
★Click Here to Open This Script
対象アプリケーションに対してコマンドを実行し、Securityダイアログが表示され、ユーザーによってきちんと認証されれば、tccKitを用いて認証状況を確認して、すべてのアプリケーションの認証完了状態をAppleScriptから知ることができます。
AppleScriptアプリケーションの冒頭(applicationWillFinishLaunchingイベントハンドラなど)でtccKitによって認証状態をチェックし、未認証の状態であれば操作対象のアプリケーションに対して試験的にコマンドを実行するようにすればよいでしょう。
AppleScriptアプリケーションがCode Signされていれば、セキュリティ認証ダイアログでユーザー認証する必要があるのは初回のみです。現在、Xcode上でGUIアプリケーションをビルドするためにはApple Developper Accountが必須となっているため、この点は必然的にクリアされることになります。
なお、この認証フローにおいてアプリケーション自体がSandbox化されている必要はありません(確認ずみ)。
セキュリティダイアログに表示するメッセージをローカライズする – AppleScriptの穴 says:
[…] 昨日の段階では、このセキュリティダイアログに表示させる内容がローカライズできないと思っていました。 […]
macOS 10.14のバグ? アクセシビリティ認証 – AppleScriptの穴 says:
[…] (1)Info.plistに「Privacy – AppleEvents Sending Usage Description」のエントリを作成する(このエントリの内容の文字列が、アプリケーション初回起動時のセキュリティダイアログで表示され […]