Launch Services と Internet Config

FOO: few01%at%mac.com (%at%を@に置き換え)
2002/2/211


  1. はじめに
  2. Launch Servicesの優先順位
  3. Internet Configの役割
  4. Internet Configからwebブラウザまでの流れ
  5. スキーマヘルパーとファイルヘルパー
  6. fileスキーマ処理とMac OS Xの野望
  7. Internet Configを使ったwebブラウザ起動プログラム
  8. Internet Configからの設定情報の取得
  9. Launch Servicesによるファイルオープン


1. はじめに

ファイルをダブルクリックすると、アプリケーションが開く。この一件単純な、それでいて相当面倒な仕組みをMac OS Xで処理しているのがLaunch Services Managerだ。

また、受け取ったメールの中に書かれているURLをクリックするとwebブラウザが開いて該当するwebページを見ることができる。これは、システム機能設定のインターネット設定で、デフォルトwebブラウザを設定しているためだが、このインターネット設定関連の機能を受け持つのがInternet Configである。

さて、あるメーリングリストで、file://で指定したURLの扱いが、Mac OS 9とMac OS Xで異なるという報告があったのに端を発っして、色々調べている内に、これはMac OS Xの仕組みのかなり興味深い所に根ざしていることがわかった。今回はそのネタをベースに、Launch ServicesとInternet Configの解説および、これらを使ったプログラミングについて述べる。



2. Launch Servicesの優先順位

TN2017 (http://developer.apple.com/technotes/tn/tn2017.html)

によると

ファイルを開く時にはLaunch Servicesというのが動き、そのアプリケーションの選択の優先順位は以下の通りになっている。

  1. ユーザが指定(ドラッグアンドドロップなど)
  2. クリエータ
  3. 拡張子
  4. ファイルタイプ
  5. アプリが受け付けないときは無視
  6. ネイティブアプリを優先、Classicアプリが次
  7. 同じアプリはバージョンが新しい物

クリエータはOS 9以前から使われていた識別方法で、ファイルを作成したアプリケーションの記号がファイルに付与されているものだ。しかしOS Xからは、クリエータがついていないファイルも比較的普通に使うように変わった。そこで3の拡張子への対応がかなり高い優先度に扱われている。

拡張子とアプリケーションの対応関係は、OS 9以前にはFile Exchangeというコントロールパネルが対応していた。もともとMac OSには拡張子がなかっただが、Windowsとのファイル互換性を良くするために、後から用意された拡張機能であった。

Mac OS Xでは、これが標準の機能にまで格上げされることになった。さて、OS 9以前にFile Exchangeで設定できた拡張子とファイルの対応は、Mac OS Xではどうやって設定するのだろう。

それは、ファイルの「情報を見る」で、「このアプリケーションで開く」に選択メニューがあるので、そこで選ぶのである。また、このメニューには「すべてを変更...」というオプションがついており、それを選ぶと、同じ拡張子のすべてのファイルが今設定したアプリケーションで開かれるようになる。

例えば"abc.html"というファイルの「情報を見る」で、"OmniWeb"を選べば、このファイルはOmniWebで開かれるようになる。ちなみに、このメニューで「作成アプリケーション」と書かれているのがクリエータの情報である。「すべてを変更...」とすると、htmlの拡張子を持つファイルはみなOmniWebで開くようになる。

ところで、上述の優先順位は、実はもう少し複雑のようである。というのはクリエータがついているファイルの「情報を見る」で、クリエータとは別のアプリケーションを指定すると、クリエータには関係なくそのアプリケーションで開くようになるからだ。つまり優先順位の2と3が入れ代わっている。これは優先順位1の変形と考えられるのだろう。ユーザが指定した対応関係は、別に保存され、それは2のクリエータよりも優先されるということのようだ。どのように保存されているのか、またいつでもそうなのか、などは、より詳細な技術文書の公開を待つしか無い。

さて、先ほどの「情報を見る」メニューで、候補としてメニューに出てくるアプリケーションはどうやって選ばれているのかに興味を持った方もいるかもしれない。そういう人は、以下の木下氏のサイトを読まれると良い。

「Mac OS X のファイル関連付け ファイルの関連付けのしくみ」

さてCarbonプログラミングを扱う本サイトとしては、ここでLaunch Servicesを使ったプログラミングに入りたい所だが(TN2017にも書かれている)、次にInternet Configの解説を行って、その後で扱おうと、思う。実は、Mac OS Xでは、この二つのサービスは関連がとても強いのだ。



3. Internet Configの役割

Internet Configは、インターネット関連の設定情報を集中して覚えておいてくれる機能である。システム機能設定の「インターネット」から設定できる情報と対応している。例えば、「デフォルトwebブラウザ」を"OmniWeb"に変更する。そうすると、Jeditで文書中にURLが書かれているのを"command+クリック"したときに、"OmniWeb"でアクセスできるようになる。

ところが、メールアドレスをいくつも持っているのが珍しくないご時世では、一つしかアドレスが登録できないのでは使えないし、またメールソフトが独自に複数のアドレスを管理するのが現状では普通である。他にもネットニュース(NNTP)は、最近は読まない人の方が多いだろう。こういう傾向からして、Internet Configの役割は大分小さくなっている。また、これは主観であるが、AppleのInternet Configへのサポートも弱っているように感じる。

とはいえ、まだ現役で良く使われる機能もある。それが前述の、URLクリックによるWebブラウザとの連係機能である。私自身もMail文中のURLをクリックしてwebページへ毎日のようにアクセスしている。この仕組みはInternet Configが扱っている。

そして、プログラム中からは、ICLaunchURLというInternet ConfigのAPIを介して、使うことができる(使い方は後述)。先頭のICはInternet Configの関数という意味だ。

さて、ここで問題だ。

まずメール文中に、"http://www.google.com"と書かれているのをクリックすると、当然だが、デフォルトwebブラウザでgoogleのサイトが開く。また"https://www.site1.secure.com"と書かれているのをクリックしても、www.site1.secure.comが、デフォルトwebブラウザで開かれる。では、"file:///Users/user1/Sites/index.html"と書かれてあったら、どうなるだろう。

正解は、Mac OS Xでは、index.htmlというファイルが、上述のLaunch Servicesで開かれる、というものだ。そのため、index.htmlがIEで開く設定になっていると、デフォルトwebブラウザを何に設定しようともIEで開かれることになる。

同じ関数の、URLに対する処理なのに、こういう違いが出るのは何故だろうか。それを説明するのが、この文章の目的である。ちなみに、Mac OS 9以前では、同じURLに対して、デフォルトwebブラウザが立ち上がり、index.htmlを表示する。なぜ、OS 9からOS Xになると振る舞いが変わるのか。



4. Internet Configからwebブラウザまでの流れ

ICLaunchURLでURLを与えて関数を呼び出すと、Internet Configは次のステップで処理を行う。

(1) URLを解読する(パージングする)

(2) 対応するヘルパーを探す

(3) 対応するヘルパーに対しApple Eventを発行する

(1)では、URLの最初の:までを調べる。つまり"http"なのか、"ftp"なのか、そして"file"なのか、などを調べるのだ。このURLの先頭についている、"http"や"ftp"などをURLスキーマと呼ぶ。

ちなみにftpのURLで、ユーザ名を指定するには、最初にuser@をつけると良い。たとえば、
 ftp://foo@medusa.myhome.com
は、fooというユーザで、medusa.myhome.comのftpサーバにアクセスする、という意味だ。パスワードが必要な時はダイアログが表示される。

(2)では、URLスキーマに対応するヘルパーを探す。httpスキーマの場合は、httpのヘルパーを探す。デフォルトwebブラウザにOmniWebが設定されていれば、httpヘルパーはOmniWebである。

(3)では、そのヘルパーに対して、URLを開くように、というApple Event('GURL')を送る。



5. スキーマヘルパーとファイルヘルパー

前章でのhttpヘルパーや、ftpヘルパーは、httpやftpというURLスキーマに対応したヘルパーなので、スキーマヘルパーアプリケーション、とでも言うべきものだ。

一方、それに対して、「mac-binaryのファイルに対しては、StuffIt Expanderを使う」といった場合の、StuffIt Expanderもヘルパーアプリケーションと呼ぶが、この二つは役割が違う。一般には、これをファイルヘルパーと呼ぶ。Internet Explorerなどの設定メニューに、ファイルヘルパーを設定するところがあるが、それはこのファイルヘルパーの設定メニューである。

前者をスキーマヘルパー、後者をファイルヘルパーと暫定的に呼ぶことにする。

当然ながら、fileスキーマヘルパー(file:ではじまるURLを処理するアプリケーション)と、ファイルヘルパーは違う。

スキーマヘルパーは、そのスキーマを適切に扱えるアプリケーションになっている必要がある。そしてファイルヘルパーは、そのファイルを適切に扱えるアプリケーションになっている必要がある。

Internet Configには、スキーマとスキーマヘルパーとの対応表を貯えておく機能がある。そして、実はファイル(正確には拡張子から類推されるMIME)と、ファイルヘルパーとの対応表を貯えておく機能もある。

このうち、ファイルヘルパー対応表は、アプリケーションが受信したファイルの処理がわからない時に参照するものだ。ただし、IEなどのように独自に対応表を持っている場合は、参照されない。



6. fileスキーマ処理とMac OS Xの野望

では、file:ではじまるURLはどう処理されるのだろうか。OS 9でのInternet Configでは、fileスキーマヘルパーが設定されているかどうかをInternet Configでは調べる。そして設定されていれば、そのヘルパーにURLを開くように指令を送る。もしない場合は、httpスキーマヘルパーが代用され、httpスキーマヘルパーにURLを開くように指令が送られる。

OS 9のインターネットコントロールパネルは、Internet Configの設定をする所だが、ここにデフォルトwebブラウザを設定すると、httpスキーマヘルパーと、httpsスキーマヘルパーと、fileスキーマヘルパーが、そのwebブラウザに設定される。

そのため、上述したように、file:ではじまるURLは、デフォルトwebブラウザで開かれることになる。

それに対して、Mac OS Xでは、システム機能設定の「インターネット」で、デフォルトwebブラウザを設定すると、httpスキーマヘルパーと、httpsスキーマヘルパーは、この設定したデフォルトwebブラウザに設定される。しかしfileスキーマヘルパーには反映されない。

そして、実は、file:ではじまるURLは、fileスキーマヘルパーが何になっていても、Launch Servicesに送られてファイルが開かれる。

そのため、デフォルトwebブラウザを変更しても、さらにはInternet ConfigのAPIを使って、強制的にfileスキーマヘルパーを変更しても、file:ではじまるURLの処理には反映されない。すべてはLaunch Servicesまかせである。

どうしてこんなことになっているのだろう。

これを考えるために例をあげる。例えば、file:ではじまるURLでMS Wordのファイルや、Adobe Illustratorのファイルが指定されていたとする。file:で始まっているのだから、ローカルのファイルである。

もしICLaunchURLが、OS 9のような振る舞いをしたら、どうなるだろうか。MS WordやIllustratorのファイルのアドレスが、デフォルトwebブラウザ、例えばIEなどに送られることになる。もちろんほとんどの場合、IEはそんなファイルの処理はできないので、「プラグインが無い」などのメッセージを出して処理は行われないだろう。もちろんIEの中のファイルヘルパー対応表に、.docはMS Wordに、.aiはIllustratorに、という対応が書かれていれば、そのアプリケーションが開くが、こんな対応は普通は書いていない。またファイルヘルパー対応表は拡張子からしか情報が得られないので、拡張子がないファイルの場合は、太刀打ちできないことになる。

OS Xでは、Launch Servicesが処理を行うので、そういった不都合はなくなる。最初に述べた優先順位に従って適切なアプリケーションが選ばれ、ファイルが開かれることになる。Word文書は、MS Wordで、illustratorのファイルは、Adobe illustratorが開く。

さて、では、file:ではじまるURLで、Wordの文書や、Illustratorのファイルを指定することがあるのだろうか?

Mac OS 9以前には、こういうことは、ほとんど起こらなかった。URLは主にインターネット経由で得られる情報を参照するときにしか使わなかったからである。

ところが、Mac OS Xでは、URLは任意のファイルを参照する方法として、認められている。URLとファイル識別子の対応を扱うライブラリが用意されている(URL Service)。したがって、URLでWord文書を指定するのは、一般にありえる。

URLというのは、ネット上のファイルも、ローカルのファイルも同じ枠組みで扱える便利な参照子である。Mac OS Xでは、ファイル参照にURLを標準サポートすることで、ファイルへのアクセスをネットワークアクセスを考えずに行える。しかし外の世界と、内の世界は、相当に引きずるものが違うため、このような不思議なことになったものである。

この設計思想の正否は、まだ現段階ではわからないが、かなり野心的な試みであるとは言える。今後どのように発展してゆくか、おもしろい所だ。



7. Internet Configを使ったwebブラウザ起動プログラム

さて、以下の章で、これらInternet ConfigやLaunch Servicesを使ったプログラミングの初歩を解説したいと思う。

最初は、図のようなアプリケーションで、フィールドにURLを記入して、ボタンを押すと、webブラウザが起動する。プロジェクトは以下からダウンロードできる。

http://homepage.mac.com/few01/LCFE/ICtest1.sit

テキストフィールドからの文字列の取得や、ボタンをクリックした時のイベント処理は、LCFE020127の「6.2 イベントハンドラの使い方」を参照。



8. Internet Configからの設定情報の取得

次は、ヘルパーアプリケーション名の取得をするプログラムである。

プログラムの見た目はこのようなもので、helper schemeと書かれた横のフィールドに"http"とか"file"などと書いて、ボタンを押すと下のフィールドにアプリケーション名が表示される。

Pascal文字列と、C文字列と、そしてCFStrの変換などが、ちょっとトリッキーだろうか。

プロジェクトは以下からダウンロードできる。

http://homepage.mac.com/few01/LCFE/ICtest2.sit



9. Launch Servicesによるファイルオープン

最後に、Launch Servicesをプログラムから呼ぶ方法の解説を兼ねて、httpヘルパーで任意のファイルを開くという、奇妙なプログラムを紹介する。Mac OS 9までのICLaunchURLの処理を模擬したようなものだ。

このようなインタフェースで、テキストフィールドにファイルのフルパスを入力し、ボタンを押すとhttpヘルパー、つまり、デフォルトwebブラウザで指定したアプリケーションで、そのファイルが開かれる。

フルパスとは、Macintosh HDなどのドライブ名で始まる":"区切りの形式だ。

プロジェクトは以下からダウンロードできる。

http://homepage.mac.com/few01/LCFE/LCtest1.sit

(c) few01@mac.com --[2002/2/21]--