ScriptingBridgeの初歩の初歩

今日は社内勉強会でScriptingBridgeについて喋ったので、こちらにも書いておきます。
喋ったと言っても詳しいわけではなく、自分の勉強したことを共有しただけなので、間違いがあれば指摘頂けれると幸いです。

ScriptingBridgeとは、一言で言うとCocoaで他のアプリケーションと連携する仕組み」

Windowsで言うところのActiveX(OLE)コントロールです。
ScriptingBridgeは、OS10.5からの機能で、それまではAppleScriptを使わないと連携できなかったようです。
(すみません、AppleScriptは経験がありません)
AppleScript単体ではなく、自分のCocoaアプリケーションに組込むには手間がかかったようで、ScriptingBridgeはそれに比べて簡単という利点があります。

事前準備

Appleのドキュメントによると事前準備がいるようです。

  1. Scriptingアプリケーションのためのヘッダファイルを生成する
  2. 生成したヘッダファイルをプロジェクトに追加する
  3. ヘッダファイルをimportする
  4. Scripting Bridgeフレームワークをプロジェクトに追加する

ここでのポイントは1です
iTunesを例にすると、ターミナルで下記を実行すると生成されます。
sdef /Applications/iTunes.app | sdp -fh --basename iTunes

  • sdef コマンド:

指定したアプリケーションからスクリプト定義(scripting definitions) をXMLで取得する

  • sdp コマンド:

それをObjective-Cのヘッダファイルに加工する

詳しくはManコマンドで・・・

実際に使う

これが拍子抜けするくらい簡単です。
今回はiTunesの現在再生中の曲名とアーティスト名の取得、そして前と後の曲へのスキップです。

まずはヘッダファイルで定義を

iTunesApplication *iTunesApp;

そして、applicationDidFinishLaunchingあたりで

iTunesApp = [SBApplication applicationWithBundleIdentifier: @"com.apple.iTunes"];

もうこれで後はこのインスタンスiTunesAppを使って操作や取得ができます。

再生中の曲名、アーティスト名を取得するなら

NSString *currentTrackName = [iTunesApp.currentTrack name];
NSString *currentArtist = [iTunesApp.currentTrack artist];


前後の曲にスキップするなら

[iTunesApp nextTrack];
[iTunesApp backTrack];

数行で実現してしまいます。

AppleのサンプルコードにはMail.appとFinderを使うのがありますし、他にもScriptingBridgeで連携できるアプリがあるようです。

最後にAppleのドキュメントのリンクを。
Introduction to Scripting Bridge Programming Guide for Cocoa