Dock の UTI 対応の罠

Kaku の画像挿入機能ですが、Kaku のアイコンに画像ファイルをドラッグ&ドロップすることでも、画像を登録できるようにしたいと考えています。でも、ちょっと詰まりました。

ある種類のファイルを、アプリケーションアイコンへのドラッグ&ドロップで開けるようにするには、(僕が知る限り)Xcode の、「プロジェクト」→「アクティブターゲット‘…’を編集」→「プロパティ」タブ→「書類のタイプ:」 に、開きたいファイルの種類を指定します。

開きたいファイルの種類を指定する方法は、昔からある 拡張子、MIME タイプ、タイプ/クリエータ のほかに、Tiger からは「 UTI 」というものが加わりました。

UTI についての詳しい説明は、Wikipedia の記事 やリンク先に譲るとして、要は、先ほど挙げた、拡張子をはじめとした レガシーなファイルタイプ指定方法をラップ し、さらに、クラス継承のような 継承関係 を持たせる、という仕組みです。

Panther 以前との互換性を考慮するのであれば、ファイルの種類を拡張子などで指定する必要がありますが、Kaku はいちおう Tiger 以降専用なので(今のところあまり意味がないのですが…汗)、UTI だけでもよさそう1 です。

そこで僕は Kaku に、UTI「 public.image 」を指定してみました。

ここが UTI のマジック で、public.image は下位に「 public.png 」「 public.jpeg 」などが定義されており、public.image ひとつ指定するだけで、拡張子の小文字/大文字や、拡張子と MIME タイプの違いをすべて吸収 して、ただ「画像ファイルっぽいもの」を開けるようになる(はず)のです。

ところが、Kaku を再ビルドして画像ファイルをドロップしようとすると…

受け付けてもらえません。

ともかく、国内外ともに、「 UTI をこんな感じで活用してるよ! 」という情報が少なすぎて( UTI とは何か、という情報はあるけれど…検索力? )、何かやり方でも間違っているのかと思ったら、(これもかなり時間がかかって)2年ほど前の この記事 を発見して、答えが分かりました。

記事を参考にしつつ書くと、前述の「マジック」を起こすには、開こうとしているファイルの UTI が、アプリに登録されている UTI と一致するか、ということより、ファイルの UTI が、アプリに登録されている UTI に準拠conformしているか をテストするべきです。

残念ながら Dock は、前者のテストしか行っていない ようです。よって、「 public.image 」の代わりに「 public.png public.jpeg… 」と列挙すれば動作するのですが、それではメリットが半減… ちなみに、Finder はちゃんと対応している ようです。

ネット上の UTI の情報が少なく感じるのは、Panther 以前との互換性を気にしている人がまだ多いのか、それとも、こういうことがあるからなのか。…地味な部分ながら、本当の意味で先進的な機能だと思うので、ちゃんと対応してほしいものです。


  1. ちなみに Tiger 以降 で動いているアプリでは、UTI と拡張子等が同時に指定されている場合、UTI 以外は無視される ようです。 

Leave a Reply

Your email address will not be published. Required fields are marked *