Xcode上で記述し、他のアプリケーションを操作するAppleScript Cocoaアプリケーションで、セキュリティダイアログに表示する内容(Info.plist内のエントリ)をローカライズする方法について紹介します。
セキュリティダイアログを表示させてユーザーの認証を得る
まず、macOS 10.14, Mojaveではセキュリティ機能が強化され、アプリケーションから他のアプリケーションをAppleEventで操作しようとすると、ユーザーに認証を求めます。この動作は、同一アプリケーションでは初回時のみ行われます。アプリケーションのバージョン・アップ時に再度問い合わされることはありません。
このセキュリティ認証をユーザーに求める動作は、Code Signしてあるアプリケーションであれば初回起動時の初回AppleEvents発行時のみ行われます。最新版のXcode上でアプリケーションを開発する場合にはCode Signできること(=Apple Developper Account年間契約を行っていること)が前提条件となるため、Code Signしない場合については言及しません。
# セキュリティダイアログで「OK」しなかった場合でも、あとからシステム環境設定>セキュリティとプライバシー>プライバシー>オートメーション の項目でチェックを入れれば認証したのと同じことになります。この項目、1年使い続けると項目数がヤバいぐらい増加しそうですが、そのあたりの膨大な数になったときの使い勝手が一切考えられていないバカっぷりが素敵です(項目のしぼりこみぐらいできないとまずい)
セキュリティダイアログを表示してユーザーに認証を得るためには、
(1)Info.plistに「Privacy – AppleEvents Sending Usage Description」(NSAppleEventsUsageDescription)のエントリを作成する必要がある
(2)AppleScriptアプリケーション内にて、セキュリティダイアログの認証が必要な動作(新規ドキュメントを作成するなど)を、アプリケーション起動中あるいは起動直後のタイミングで行い、セキュリティダイアログでユーザーの認証を得ておく(ことが望ましい)
という状態です。
セキュリティダイアログのメッセージをローカライズする
昨日の段階では、このセキュリティダイアログに表示させる内容がローカライズできないと思っていました。
その後、冗談半分で「Info.plistの内容のローカライズ方法」などと検索エンジンで調べてみたら……さがしてみるもので、すぐに方法が見つかりました。
# 冗談半分で探してみる、というのはけっこう強力なソリューションです
Info.plistの内容のローカライズを行う場合には、InfoPlist.stringsというファイルを作成して、そこに(おなじみの)ローカライズ文字ファイルを、
"key" = "value";
のように記述しておき、InfoPlist.stringsファイルをXcode上でローカライズするのだとか。
Info.plistのエントリのローカライズ
Info.plistに「Privacy – AppleEvents Sending Usage Description」のエントリを作ってある状態から話をすすめます。
このままでは、このエントリのキー名称がよくわからないので、Info.plistをテキスト形式でオープンし直します。
すると、このエントリのキー名称が「NSAppleEventsUsageDescription」だということがわかります。
そこで、Xcodeのプロジェクトに「空のファイル」としてInfoPlist.stringsファイルを追加し、ローカライズします。ここでは、デフォルトで用意されるEnglishのほかにJapaneseを追加しました。
この状態でXcode上でビルド+実行(Command-R)を行うと、
のように、日本語環境にあわせてローカライズしておいたメッセージが表示されることが確認できました。
Double PDF v2.0完成に近づく – AppleScriptの穴 says:
[…] ど、地味に工数が増えるのは勘弁してほしいです。あとは、外部アプリケーション操作要求を行うためのInfo.plistのエントリ追加などもあります。これを追加しないと外部アプリケーショ […]
2019年に書いた価値あるAppleScript – AppleScriptの穴 says:
[…] Pages書類の1ページ目の表の背景色を置換 v4 セキュリティダイアログに表示するメッセージをローカライズする このあたりは、必要に迫られていろいろ試行錯誤したものですが、macOS […]