AppleScript
macOSのアクセシビリティ系の機能に、フローティングパレット上に配置したボタンからキーボードショートカットやAppleScriptの実行を行えるSwitch Controlがある。バンドル形式のScriptを読み込んで実行できない、Scriptのバンドル内に実行ファイルを入れて呼び出すことができない、ユーザーディレクトリ下のAppleScriptライブラリを認識しない、といった運用上の制約がある。
日本語音声認識でAppleScriptを実行できる。実行可能形式は、AppleScriptのフラット形式(.scpt)およびAppleScriptアプレット。Siriとは別の音声認識コマンドであり、あらかじめ指定しておいた固定文字列を日本語音声認識して、合致すればコマンドを実行する。macOS 12でショートカット.appがmacOSに搭載されたことにより、AppleScriptを実行可能な音声認識コマンドの実行系が2つ存在している。
FileMaker Proを外部からAppleScriptでコントロールするよりも、FileMaker Proスクリプトの「AppleScriptを実行」スクリプトステップ中にAppleScriptをコピー&ペーストで入れて実行する方が数倍高速に実行される。画面の再描画などを抑止するほか、高速実行するための仕組みを備えている。
Microsoft OfficeのVBAスクリプト内でも、AppleScriptを呼び出す仕組みが用意されている。Excel v.14.xまでは「MacScript」コマンドにより文字列で与えたAppleScriptが、Excel v.15.xでは「AppleScriptTask」コマンドによりファイル名を指定して外部のAppleScriptを実行できるようになっている。
同様に、Adobe InDesignの「スクリプト」パレット中からAppleScriptを呼び出すことが出来、この際に画面の再描画を抑止できるため高速実行(おおよそ2倍)が可能となっている。ただし、Adobe InDesignについては大量のデータ処理時にクラッシュが発生するため、処理速度より安定稼働を重視すると外部からのコントロールも選択肢に入る。
AppleScript専用のサードパーティー統合開発環境といえるでは、デバッグ時にAppleScript互換の「AppleScript Debugger」というAppleScriptとは別のOSA言語を実行することになる。厳密にいえばAppleScriptそのものを実行するわけではないため、振る舞いが異なる箇所が出てくることは否定できない。ただし、以前(Classic Mac OS時代)に比べると純正AppleScript環境との互換性は大幅に高まっている。強力で便利な環境であるが、「デバッグ時以外はScript Debuggerを使うべきではない」という方針の開発現場もあるのは、この「互換性問題」ゆえである。
Shortcuts.appのアクションに「AppleScriptを実行」が用意されており、ショートカット内でのAppleScript実行が可能である。このアクションはmacOS専用であり、他のOS上では実行できない。Cocoaの機能呼び出しや、ユーザー環境にインストールされたAppleScript Librariesの機能呼び出しなどが可能。このことにより、Mac上であればSiri経由で日本語音声認識/テキスト操作によりAppleScriptを実行できるようになった。
スクリプトエディタ上でのコンパイル(実質的には構文チェック+中間コードへの置き換え)時には、AppleScriptの基本的な文法を外れなければ、それがたとえ実行できない命令の組み合わせであってもエラーにならない。実行時にエラーとなる。FinderのAppleScript用語辞書を見ていると「make new application」といったできそうもないプログラムを組めそうに見え、実際にFinderへのtellブロック内に記述するとコンパイルを通ってしまう。
実際には、アプリケーション側が想定している命令語の組み合わせは限定されたものである。また、想定された条件下によっては実行できるが、条件がそろわないと実行してもエラーになったり無意味な結果になるものもある。このため、アプリケーションが備えている機能を逸脱しない表記、アプリケーションの用語辞書で実現可能な記述パターンの情報を収集することには大いに意義がある(Appleが主催するメーリングリストのアーカイブの検索がこれに適している)。また、Scriptはこまめに実行して想定どおりの実行結果が得られているかを確認するとよい。
たとえば、printコマンドでプリンタを指定して書類を印刷する機能が存在していても、LAN内に存在するプリンタ名一覧を取得する機能はデフォルトでは用意されていない。同様に、テキストの音声読み上げを行うsayコマンドで音声キャラクタの名称を指定できるのに、現在システムにインストールされている音声名称の一覧を取得する機能が存在していない。このため、shell scriptやCocoaのサービスを呼び出して、取得する手段を別途用意する必要がある。
何らかの条件に基づいてオブジェクトを抽出する処理が、アプリケーションコントロールでは日常的に発生する。たとえば、リマインダーで名称(name)に「発売日」を含む項目のみ抽出するといった処理である。そのような場合に、オブジェクトの抽出をせずに「とりあえずすべてのオブジェクトを取得して、ループで条件一致するものを抽出する」ようなコードでは処理が遅くなってしまう。フィルタ参照を使って対象オブジェクトのしぼりこみを行うと速度を向上できる。
ただし、64bit化されたFinderではこのフィルタ参照の処理速度が大幅に低下しており、Finderに対して複数のフィルタ参照を実行すると速度が落ちる点に注意が必要である。
何らかのオブジェクトの属性値を取得したい場合に、複数の属性値を何回かに分けて取得するよりもpropertiesでまとめて属性を取得した方が速いケースなどがある。アプリケーションをコントロールするために存在しているAppleScriptであるが、アプリケーションとの通信回数を減らすことが処理の高速化につながる。
例えば、指定フォルダ以下の全てのファイルを処理する場合、Classic Mac OS時代にはFinderに対して再帰処理で取得するように書いていたが、現代のmacOSではSpotlightを用いてファイル一覧を取得するとずっと速く処理できる。このように、macOSの機能の移り変わりを意識していないと処理速度が大幅に変わる。
Music(iTunes)、Keynote、Pages、NumbersなどApple純正アプリケーションに固有の問題が存在する。アプリケーションのローカライズをやりすぎて、AppleScript関連の機能までローカライズされている例が多々ある。このため、海外で流布しているAppleScriptの、主にオブジェクト名称を英語名表記から日本語名表記に変更しないと日本語環境上では実行できない(エラーになる)ケースが存在する。
あまりに拡張され、できることが増えすぎたため、AppleScriptの一部機能を抑止するための機構がmacOSに用意されつつある。以下の機能についてはデフォルトでは禁止状態になっているが、管理者パスワードを入力すれば実行を許可するようになっている。
ネットワーク上の他のMacからのコントロールを行うリモートApple Eventsに対し、macOS標準装備の各アプリケーションは応答しないようになっている。また、出荷時のデフォルト設定で、リモートApple Eventsはオフになっている。
画面上のメニューやボタンなどを操作するGUI Scriptingについては、「システム環境設定」の「セキュリティとプライバシー」>「アクセシビリティ」で個別に許可を行うようになっている。デフォルト設定では、どのプログラムに対しても許可していない。
Safari 9.1.1より、「開発」メニューに「Apple EventsからのJavaScriptを許可」の項目が新設され、これにチェックを入れないとAppleScriptからSafariに対してdo javascript命令を実行できなくなった。いったん許可すれば、その状態は継続される。
FileMaker Pro v16より、FileMaker Script中におけるAppleScriptの実行(正確にいえば、AppleScriptからFileMaker Pro自身を操作すること)がデフォルトの権限セットのままでは許可されない状態になっている。そのため、より以前のバージョンで作成したFileMaker ProデータベースをFileMaker Pro v16でオープンすると、FileMaker Script Step実行時に「実行権限エラー」ダイアログが表示され、Script Stepの実行が行われないという現象に直面することがある。このような場合には、拡張アクセス権で「Apple EventおよびActive-XによるFileMaker操作の実行を許可」にチェックを入れれば実行できるようになる。
macOS 10.14より、システム環境設定の「セキュリティとプライバシー」>「プライバシー」項目にセキュリティ度を調整するための各種機能が追加され、AppleScriptもその影響を受けるようになった。
「フルディスクアクセス」項目では、動作中のMacのすべてのユーザーに対して、ユーザー自身のメール、メッセージ、Safari、ホーム、Time Machineバックアップなどのデータや特定の管理設定へのアクセスを許可する。AppleScriptを利用するユーザーはこの項目に「スクリプトエディタ」と「スクリプトメニュー」を登録しておく必要がある。
「オートメーション」項目では、他のアプリケーション制御の許可、および取り消しを行える。スクリプトエディタ以外のアプリケーションで、他のアプリケーションを制御する場合には、動作中の最初の要求時にユーザーに対して承認を求めるダイアログを表示する。承認されたアプリケーションはこの「オートメーション」項目に表示されるようになる。実行したユーザーが承認しなかった場合にも、本項目にチェックボックスがオフになった状態で表示されるため、あとからシステム環境設定上の本項目において承認を行う(チェックボックスをオンにする)ことが可能である。
なお、一度「オートメーション」項目に登録され、ユーザーの承認を得ていれば、毎回ユーザーの承認ダイアログが表示されることはない。
逆に、本「オートメーション」項目に意図的に登録させたい場合、アプリケーションのバージョン番号を確認したり最前面に表示させる(activate)コマンドを実行させる程度ではシステムが反応しない。他のアプリケーションを操作するAppleScriptアプレット/AppleScriptアプリケーションにおいて、初回起動時に「オートメーション」項目に登録される程度の簡単な(害のない)アプリケーション操作を意図的に行う必要が生じるようになった。AppleScript側から任意のアプリケーションに対する操作が許可されているかを知ることは、サードパーティのフレームワークを呼び出すことで可能となっている。
macOS 10.11以降、SIPによる機能制限が段階的に強化され、macOS 10.14においてはApple純正のスクリプトエディタにも制限が加わった。ホームディレクトリ下の「ライブラリ」フォルダ中の「Frameworks」フォルダ(デフォルトでは存在しない)へのアクセスがSIPにより禁止された。macOS 10.14上でこの制限を回避するには、サードパーティの開発環境「Script Debugger」を利用するか、SIPそのものを解除する必要がある。
macOS 10.15以降、リモートApple Eventsでネットワーク上の他のMac上のAppleScriptから命令を受け付ける場合、呼び出す側と受け付ける側のユーザー名が同じである必要があるようになった。なお、簡単なシェルコマンドでこの制限は無効にすることができる。
macOS側のセキュリティ機能とAppleScriptの処理系のすり合わせが不十分なままOSがリリースされてしまったために、macOS 10.12, SierraにおいてはAppleScriptをドロップレットとして保存し、ファイルをドラッグ&ドロップした場合には、ファイルの処理が行われなかったりファイル処理の順序が以前のOSのとおりに行われなかったりする。
これは、ファイルの拡張属性(Xattr)の1つ「com.apple.quarantine」により発生する。インターネット上からダウンロードしたファイルなどは、その安全性が担保されていない状態であると(macOSが)みなし、この「com.apple.quarantine」属性が添付される。
ユーザーの操作によりファイルのオープンを許可された(「ダウンロードされたファイルですが、オープンしてもよいですか?」という確認ダイアログでユーザーに承認)場合には処理されるが、同属性がついたままだとドロップレットによる処理が行われない。一応回避手段は存在するが、初心者には理解が難しいものとなっている。
。
sayコマンドで日本語読み上げ音声を指定して「もげる」「捥げる」を読み上げると正常に読み上げられない(NSSpeechManagerのバグで、SwiftやObjective-Cでも同様のバグが発生し、iOSでも状況は同じ)。。
Enum「NSNotFound」の定義が間違っており、-1ではない値を返す(10.13.1にて修正)。
AppleScriptからCocoaの機能を呼び出す際にScripting Bridgeの仕組みが利用されているが、このScripting Bridgeの定義ファイルに問題があり、いくつかの機能が正常に呼び出せない状況が確認されている。。
NSRectが属性ラベルつきのレコード型ではなくリスト型に変換されるようになっている。
PDFViewに対してcurrentPage()を実行してもPDFPageが返ってこない。このため、PDFView上でPDFを表示させるGUIプログラムに影響が出ている。