Skypeでは「callto:」, Peercastでは「peercast:」なんかの「オレオレ・プロトコル」がアプリケーションに関連付けられています。これらは、Web上のHTMLファイルからURLクリック(または、同等の処理)で、アプリケーションを起動させることができる、という利点があります。(もちろんセキュリティ上の問題もあるのですが、その話はまた別途)。
このプロトコルとアプリケーションの関連づけ、つまりプロトコルヘルパのアプリケーションをOSX上で作成する方法について、Mac初心者(利用歴1ヶ月くらい)がまとめたメモを残しておきます。よく理解できていない箇所もあるのでツッコミは大歓迎です。
お題として「kefir:」というプロトコルを定義したとして、ブラウザランチャアプリとして「KefirRunner」というアプリケーションを作ってみることにします。分かりやすく言うと、ターミナルから「open kefir://yahoo.co.jp」と入力すると、Firefox(標準のブラウザ)がyahoo.co.jpを開く感じです。
アプリケーションの構成
まず、OSXではアプリケーションは基本的には次のような構成になっています。
KefirRunner.app/
- Contents/
- Info.plist
- MacOS/
- Resources/
KefirRunner.appがアプリケーション「KefirRunner」にあたります。OSX上では、拡張子「app」のディレクトリはひとまとまりなアプリケーションとして認識されます。実際、/Applications の中身をターミナルで覗いてみると、Finder上では1つのアイコンにまとまって見えたアプリケーションも、実はただのディレクトリであることが確認できると思います。
さて、KefirRunner.appの中には「Contents」というディレクトリが入っています。さらに、その中にはアプリケーション全体の仕様について述べた「Info.plist」、実行プログラムの実体が収められた「MacOS」ディレクトリ、アイコンファイルなどリソースファイルが格納された「Resources」ディレクトリがあります。(さらにアプリケーションのライブラリが格納された「Library」ディレクトリが存在する場合や、それ以外のファイル、ディレクトリが存在する場合もあります)
Info.plist
プロトコルヘルパでポイントとなるのは、info.plistです。ここで実行ファイルが任意の「オレオレ・プロトコル」を扱うことができるように、その設定を記述することとなります。Info.plist自体の説明はここでは省略しますが、要するにアプリケーション名やアイコンファイル名、Dockに表示させるかどうか、なんかの情報をXML形式でまとめたものと考えて良いと思います。
実際のプロトコル情報は、plist > dict 内にkey:「CFBundleURLTypes」で設定します。たとえば「kefir」プロトコルを設定する場合は、次のような内容を追加することになります。
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>kefir URL</string>
<key>CFBundleURLSchemes</key>
<array>
<string>kefir</string>
</array>
</dict>
</array>
<key>NSiUIElement</key>
<true/>
ポイントは「CFBundleURLSchemes」のValueに設定したいプロトコル名を設定すること。あとはお決まりの定型文のように考えておいて大丈夫です。Info.plistの編集はこの後にも行う必要があるので、この段階では「こんな風に編集する必要があるんだな」くらいに考えておきます。
AppleEvent
さて、あるプロトコルのアプリケーションに対するアクセスはイベントで上がってきます。MacOSX上では、このイベントは「Apple Event」という名前のイベントで上がってきます。なので、プロトコルヘルパを実装する場合は、このAppleEventを扱うアプリケーションを実装することと等価です。現在はJavaやPython、Rubyなどさまざまな言語でApple Eventを扱うことができるライブラリが存在しているので、環境に応じた言語を選択すればOKです。今回は「kefir://yahoo.co.jp」の「yahoo.co.jp」の箇所を(解析し、)取得することだけがとりあえずの目的なので、もっとも簡単なApple Scriptを利用することとします。
AppleScriptからアプリケーションを作成
まず、Finderから「/Applications/Applescript/スクリプトエディタ.app」を開き、以下のAppleScriptを書きます。
on open location v if v starts with "kefir://" then activate set kefir to text from character 7 to character -1 of v set kefir to "http:" & kefir set href to kefir tell application "Finder" to open location kefir end if quit end open location
細かな説明は省略しますが、大体の内容はそのまま読めば理解できるかと思います。イベントで上がったときに与えられた文字列が「kefir://」で始まっていたら、それ以降の文字列をopenコマンドで開いています。(エラー処理とかは省いてしまっているので、適切な処理を追加する必要はあります)
スクリプトを書いたら「コンパイル」を行い、「ファイル」から「保存」を選択します。このとき名前は「KefirRunner」に、フォーマットは「アプリケーションバンドル」を指定して保存します。
Info.plistの修正
これでKefirRunnerアプリケーションが先に説明したディレクトリ構成を保ったまま、完成しているはずです。FinderからKedirRunnerを保存したところまで移動して中身を覗いてみましょう。{$path_to_src}/KefirRunner.app/ContentsにInfo.plistがあることを確認すると、先のkefirプロトコルの内容を追加します。追加した後のInfo.plistはこのようなものになります。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleAllowMixedLocalizations</key>
<true/>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>applet</string>
<key>CFBundleIconFile</key>
<string>applet</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>KefirRunner</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleSignature</key>
<string>aplt</string>
<key>LSRequiresCarbon</key>
<true/>
<key>WindowState</key>
<dict>
<key>name</key>
<string>ScriptWindowState</string>
<key>positionOfDivider</key>
<real>310</real>
<key>savedFrame</key>
<string>423 514 870 512 0 0 1920 1178 </string>
<key>selectedTabView</key>
<string>result</string>
</dict>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>Kefir URL</string>
<key>CFBundleURLSchemes</key>
<array>
<string>kefir</string>
</array>
</dict>
</array>
<key>NSUIElement</key>
<true/>
</dict>
</plist>
要するに、"kefirプロトコルはKefirRunnerアプリケーションに関連付けられていて、実行ファイル「applet(スクリプトエディタからビルドしたときの標準の実行ファイル名)」になる" と、ということを指しています。これでKefirRunnerに必要なものは揃いました。
Info.plistの反映
Info.plistの情報をOSに反映させるためにはアプリケーションファイルを一度dmg型式のイメージファイルにまとめて、アプリケーションフォルダにD&Dし、インストールする必要があります。(イメージファイルからインストール、というのがポイント)。 たとえばフリーソフトのCleanArchiverならD&Dでdmgファイルを作成することができます。KefirRunner.appフォルダからKedirRunner.dmgファイルが作成できれば完成です。アプリケーションフォルダにD&Dでインストールを行います。
インストールが終わったらターミナルを開き、「open kafir://www.yahoo.co.jp」と入力します。これでブラウザが起動してyahoo.co.jpが開けたら無事完成です!一応完成品も置いておくのでうまくできなかった人はご参考ください。
(KefirRunner.dmg : 31.7KB)
これでターミナル上で開発してるときに「あーググりたい!」とか思ったときは迷わず
open kefir://google.com
ですよ。
「http?いいえ、kefirです。」(結局これが言いたいだけだった)
アンインストール方法
勝手にkefirプロトコルが関連付けられてしまったわけですが、この情報を削除するためにはkefirプロトコルのヘルパプログラムであるKedirRunnerをアプリケーションフォルダからゴミ箱に移して削除してしまうとOKです。簡単でしょう?
まとめ
kefirとかふざけたプロトコルを定義しましたが、たとえば独自のメーラやブラウザを作りたいときは、今回のようにInfo.plistを編集したアプリケーションバンドルを作成することで、標準のブラウザやメーラを作成することもできます。
また、Webから独自のアプリケーションを起動させることがこれでできますので、Webアプリとローカルアプリとの連携にも役立たせることができると思います。
- Newer: 恵比寿ITエンジニア会Z #01に参加してきました
- Older: WEB+DB PRESS Tech Meetingに行ってきました
Google Adsense
Social bookmark comment : 0
No comment.
Comment : 0
Trackback : 0
- TrackBack URL for this entry
- http://blog.katsuma.tv/mt-tb.cgi/110
- Listed below are links to weblogs that reference
- OSXでオレオレ・プロトコルのヘルパアプリケーションを作成する from blog.katsuma.tv
2007/12/25 (Tue)