Uniform Type Identifierの概念


Uniform Type Identifiers(UTI)は、書類、ペーストボードのデータ、バンドルといった、システム内で扱われるデータを識別するための、一本化された方法を提供します。

この章ではUTIの裏にある概念を説明し、あなたのアプリケーションバンドル内でどのようにこれらを指定するかを示します。

Uniform Type Identifierとは何か?

Uniform Type Identifierとは、「タイプ」を持つと考えられるエンティティ【存在】のクラスを、ユニークに識別する文字列です。たとえば、ファイルやその他のバイト列に対しては、「タイプ」はデータのフォーマットを指します。パッケージやバンドルといったエンティティに対しては、「タイプ」はディレクトリ階層の内部の構造を指します。

最も一般的には、UTIはすべてのアプリケーションとサービスが認識し、依存することのできるデータのための一貫した識別子を提供し、データにタグ付けするための既存のすべてのやり方を追い続ける必要性をなくします。

現在の例を挙げると、jpegファイルは以下のやり方のいずれかで識別することができます…

  • 4文字のファイルタイプコード(OSType)の'JPEG'
  • ファイル名拡張子の.jpg
  • ファイル名拡張子の.jpeg
  • MIMEタイプのimage/jpeg

UTIはこれらの互換性のないタグ付けの方法すべてを、public.jpegという文字列で置き換えます。あなたはあるものから別のものへと変換するためのユーティリティ関数を呼ぶことができるので、この文字列識別子は旧来のタグ付けの方法のいずれに対しても完全な互換性を持ちます。つまり、与えられた一つのUTIに対して、あなたは相当するOSTypeや、MIMEタイプ、ファイル名拡張子を生成することができ、その逆も可能ということです。

UTIはいかなるエンティティのクラスも識別できるため、旧来のタグ付けの方法よりもはるかに柔軟です。また、あなたは以下のエンティティのいずれも、UTIを用いて見分けることができます。

  • ペーストボードのデータ
  • フォルダ(ディレクトリ)
  • (Translation Managerで扱う)変換可能なタイプ
  • バンドル
  • フレームワーク
  • ストリーミングデータ
  • エイリアスとシンボリックリンク

加えて、あなたはアプリケーション固有の用途のために、あなたの独自UTIを定義することができます。たとえば、もしあなたのアプリケーションが特殊な書類フォーマットを用いるのであれば、あなたはそのためのUTIを宣言することができます。あなたのフォーマットに対応しようとするサードパーティ製のアプリケーションやプラグインは、そこであなたのファイルを識別するためにそのUTIを使用することができます。

UTI構文

Uniform Type Identifierは、Core Foundation文字列(CFStringRef型)です。

Uniform Type Identifierは、始めはJavaクラス階層の要素を記述するために用いられていた、そして現在Mac OS Xにおいてバンドル識別のためにも使用されている、逆DNS形式を用います。いくつかの例を挙げると…

com.apple.quicktime-movie
com.mycompany.myapp.myspecialfiletype
public.html
com.apple.pict
public.jpeg

標準DNS文字セット(A-Z、a-z、0-9、"-"と".")に加えて、あなたの識別子を指定するためにU+007F以上のUnicode文字も使用することができます。

UTI構文は、登録やその他の管理のために、中央集権的な管理者を必要とせずに、与えられた識別子がユニークであることを保障します。

ドメイン(com、public、その他)は、ドメイン階層におけるUTIの位置を識別するためだけに用いられることに注意してください。ドメインは同様のタイプをグループ化することを意味していません。

  • publicドメインは、ほとんどのアプリケーションのための、一般的に用いる共通もしくは標準的なタイプのために予約されています…
    public.text
    public.plain-text
    public.jpeg
    public.html
    
    publicドメインを持つUTIは、パブリック識別子【public identifiers】と呼ばれます。今のところ、アップルだけがパブリック識別子を宣言できます。
  • dynドメインは、特別な動的識別子【dynamic identifiers】のために予約されています。詳細は、「動的型識別子」(13ページ)を参照してください。
  • その他すべてのドメインは、サードパーティによる用途のために利用することができます。一般的に、識別子はcomドメインで始まる会社によって宣言されます。
    com.apple.quicktime-movie
    com.yoyodyne.buckybits
    

あなたは、UTIをバンドルのInfo.plistファイル内に宣言できます。詳細は「UTIを宣言する」(13ページ)を参照してください。Mac OS X v.10.4では、あなたは以下のいずれにもUTIを宣言することができます。

  • アプリケーションバンドル
  • Spotlightインポータバンドル
  • Automatorアクションバンドル

適合性

Uniform Type Identifierが、その他のタイプ識別の方法に対して優位となる鍵は、UTIは適合性階層【conformance hierarchy】の中に宣言されるという点です。適合性階層は、オブジェクト指向プログラミングにおけるクラス階層と類似しています。

「タイプAはタイプBに適合している」と考える代わりに、あなたは「タイプAのすべてのインスタンスは、タイプBのインスタンスでもある」と考えることもできます。

図 1-1(11ページ)は、いくつかのUniform Type Identifierのための適合性階層を示しています。

図 1-1 適合性階層

                    public.data
        ┌────────┼──────┬───…
        public.text    public.item    public.audiovisual-content
        │      ┌────┼────…  ├───…
        │  public.jpeg public.tiff   public.movie
    ┌─┴──┬─…                    ├─────────┬─…
public.html public.plain-text com.apple.quicktime.movie public.mpeg
              ├──────…
    com.mycorp.myapp.myspecialtext【←独自UTIの例】

たとえば、HTMLテキストを定義したpublic.htmlというUTIは、テキストのベース識別子であるpublic.textに適合しています。この場合には適合性により、一般的なテキストファイルを開くことのできるアプリケーションに対して、HTMLファイルは同様に開くことができるものであると識別させます。

あなたは、あなたのタイプの直接の「スーパークラス」だけを持つ適合性を宣言する必要があります。なぜなら、適合性階層は識別子の間の継承を可能としているからです。つまり、もしあなたがあなたの識別子をpublic.tiff識別子に適合するように宣言すると、それは自動的に階層をさかのぼった、public.imageやpublic.dataといった識別子にも適合するということです。

適合性階層は、多重継承に対応しています。たとえば、アプリケーションバンドルのためのUTI(com.apple.application-package)は、一般バンドルタイプ(com.apple.bundle)と、パッケージ化ディレクトリタイプ(com.apple.package)の両者に適合します。

あなたのUTIのための適合性を指定するとき、理想的には、あなたの項目は物理階層と機能階層の両方に適合すべきです。つまり、適合性はその物理的な性質(ディレクトリ、ファイル、その他)と、同様にその使い方(画像、動画、その他)の両方を指定する必要があります。

  • 物理階層におけるUTIは、継承階層を通じてpublic.itemに適合する必要があります。
  • 機能階層におけるUTIは、public.itemではないベース【基底】UTIへ継承を通じて適合する必要があります。たとえば、public.content、public.executable、public.archiveは、すべてベース機能UTIの例です。

機能階層への適合は必須ではありませんが、そうすることにより、よりシステムの機能と統合することが可能になります。たとえば、Spotlightは名前付き属性(タイトル、著者、版数、コメント、その他)を機能UTIと関連付けます。

図 1-2(12ページ)は、物理階層と機能階層の例を示します。

図 1-2 物理階層と機能階層

物理階層

public.item
├ public.data
├ public.directory
│    ├ public.folder
│    │    └ public.volume
│    └ com.apple.package
└ public.symlink

機能階層

public.content
├ public.text
│    └ public.plain-text
├ public.image
├ public.audiovisual-content
│    ├ public.audio
│    └ public.movie
│          └ public.video
└ public.composite-content

いくつかの場合において、あなたは両方の階層を網羅する、一つだけのUTIへの適合を宣言する必要に迫られます。たとえば、public.text、public.image、public.audiovisual-contentは、public.data(物理)とpublic.content(機能)の両方に適合しています。そこで、これらの項目の一つに(直接、もしくは間接的に)適合することにより、両方の階層を網羅することができます。

適合は、あなたのアプリケーションがどんなタイプに互換性があるかを判断するうえで、より高い柔軟性を与えてくれるでしょう。多数の条件文をコードに書くことを避けるだけでなく、あなたのアプリケーションにあなたが想定することのなかったタイプとの互換性を持たせることを可能にします。

動的型識別子

時として、あなたはUTIが宣言されていないデータタイプに出会うことがあるかもしれません。UTIは、こうした状況を、そのタイプのための動的識別子を作成することにより、明確に処理します。

たとえば、あなたのアプリケーションが認識できないNSPasteboardタイプを見つけたとしましょう。ユーティリティ関数を用いることで、そのタイプは変換可能なUTIに変換され、その結果、そのデータはやり取りできるようになります。

動的識別子はdynというドメインを持ち、文字列の残りの部分には不明確な内容が続きます。【それとも"opaque"が続くという意味?要確認】あなたは動的識別子を他のUTIと同様に扱い、ユーティリティ関数を用いて本来の識別タグを取り出すことができます。

あなたは動的識別子を、未知のファイル名拡張子、MIMEタイプ、OSType、その他を取り巻く、UTI互換ラッパとして考えることができます。

識別タグ

各UTIは、それに関連付けられた一つ以上のタグを持つことができます。これらのタグは、ファイル名拡張子、MIMEタイプ、NSPasteboardタイプといった別のタイプ識別のやりかたを示します。あなたはこれらのタグを、特定の拡張子、MIMEタイプ、その他の、UTI宣言において相当するタイプに関連付けるために使用します。

たとえば、public.jpeg識別子の宣言は、一つのOSタイプタグ('JPEG')と、二つのファイル名拡張子タグ(.jpg と .jpeg)を含んでいます。したがってこれらのタグはpublic.jpegタイプの別の識別子として考えられます。

本質的に、あなたは一つのUTIの下に、可能なすべての識別のやりかたをグループ化するためにタグを使用します。つまり、.jpg か .jpeg の拡張子、もしくは'JPEG'のOSタイプを持つファイルは、すべてpublic.jpegタイプとなる、とみなされます。

UTIを宣言する

あなたはUniform Type Identifierを以下のInfo.plistファイルに宣言します…

  • アプリケーションバンドル
  • Spotlightインポータバンドル
  • Automatorアクションバンドル

UTI文字列の宣言に加えて、宣言には以下のプロパティのいずれかを含めることができます…

  • タイプのタグの仕様。そのタイプに一致する、すべての別種の識別タグの指定。
  • この識別子が適合するUTIの一覧
  • このタイプの項目を表示する際に用いるアイコン
  • この識別子を説明する、ユーザが読める文字列。これを格納しているバンドルはローカライズされることがあります。(Mac OS X v10.4以降で利用可能)

あなたのUTI宣言は、インポートされるか、エクスポートされる必要があります…

  • エクスポートされたUTI宣言とは、そのタイプが他のすべての集団による用途に対しても使用可能であることを意味します。たとえば、独占【proprietary】書類フォーマットを使用するアプリケーションは、それをエクスポートされたUTIとして宣言する必要があります。
  • インポートされたUTI宣言は、自分では所有していないが、システム上で利用可能であって欲しいタイプを宣言するために用いられます。

    たとえば、自分のアプリケーションバンドル内でUTIが宣言されている、独占フォーマットを用いたファイルを作成するような動画編集プログラムがあったとします。もしあなたがそのようなファイルを読めるアプリケーションかプラグインを書くとしたら、たとえ実際には動画編集アプリケーションが使用不能であったとしても、あなたは確実にシステムにその独占UTIについて知らせる必要があります。

    そうするためには、あなたのアプリケーションは自分自身のバンドル内でそのUTIを再宣言します。ただし、それをインポートされた宣言として印をつける必要があります。

既存のUTI宣言に対して、インポートとエクスポートの両方が行われると、エクスポートされた宣言はインポートされた宣言より優先されます。

ここで、あなたがプロパティリストで見つけるものと同様の、エクスポートされたタイプとして宣言された、public.jpegのUTI宣言の例を挙げます。

<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeIdentifier</key>
<string>public.jpeg</string>
<key>UTTypeReferenceURL</key>
<string>http://www.w3.org/Graphics/JPEG/</string>
<key>UTTypeDescription</key>
<string>JPEG image</string>
<key>UTTypeIconFile</key>
<string>public.jpeg.icns</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.image</string>
<string>public.data</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
<key>com.apple.ostype</key>
<string>JPEG</string>
<key>public.filename-extension</key>
<array>
<string>jpeg</string>
<string>jpg</string>
</array>
<key>public.mime-type</key>
<string>image/jpeg</string>
</dict>
</dict>
</array>

表 1-1(14ページ)は、あなたがUTI宣言で使用することのできる、使用可能なプロパティキーリストの一覧を示しています。

表 1-1 Uniform Type Identifierのためのプロパティリストキー

キー 値の種類 説明
UTExportedType-Declarations 辞書型の配列 エクスポートされたUTI宣言の配列(つまり、識別子はバンドルの発行者が所有します)。

キー 値の種類 説明
UTImportedType-Declarations 辞書の配列 インポートされたUTI宣言の配列(つまり、識別子は別の企業や組織が所有します)。
UTTypeIdentifier 文字列 宣言されるタイプのためのUTI。このキーはUTI宣言には必須です。
UTTypeTagSpecification 辞書 一つ以上のタイプ識別子を定義する辞書です。
UTTypeConformsTo 文字列の配列 この識別子が適合するUTI【の配列】です。
UTTypeIconFile 文字列 このUTIに関連付けられたバンドルアイコンリソースの名前です。
UTTypeDescription 文字列 このタイプのユーザに見える説明です。(おそらく各国語化されるでしょう。)
UTTypeReferenceURL 文字列 このタイプを説明する参考資料のURLです。