Uniform Type Identifierに適応する


この章では、あなたのアプリケーションでUniform Type Identifierに適応するための、いくつかのガイドラインを提供し、またUTIを操作するためのユーティリティ関数の概要を提供します。

UTIの使い方のためのガイドライン

あなたのアプリケーションでUTIに適応するための作業は、二つの工程に分かれています。あなたは、データを識別したりやり取りする必要のあるときは、いつでもUTIを使用する必要があります。またあなたは、あなたのアプリケーションが用いる、いかなる独占タイプに対しても特定のUTIを宣言する必要があります。

アプリケーションにUTI対応を加える

アップルは、ほとんどのデータのやり取りの要求のためにUTI対応を組み込んでいます。Carbonでは…

  • Mac OS X v10.3以降では、Pasteboard Manager および Translation Manager はUTIに対応しています。
  • Mac OS X v10.4以降では、Navigation Services は、あなたにファイルのフィルタリングのためにUTIを指定できるようにします。
  • Mac OS X v10.4以降では、Launch Services はUTIベースの書類要求に対応しています。

もしあなたに、上記の内容では応えることのできない特定の要求があれば、あなたは自分のコード内でタイプをUTIへ合わせることができます。

一般的には、これはあなたが(OSType等の)別種の識別子を用いてタイプを見つけ、その識別子からUTIを作り出すことを必要とします。次に、あなたのアプリケーションが扱うことのできるタイプを定義したUTIのいずれかへの適合をチェックします。

これをどのように行うかの一例は、Navigation Services Programming Guideの、Filtering the Types of Files That Users Can Openを参照してください。

重要:あなたのコードの中でシステム定義されたUTIを用いるときは、あなたは実際のUTI文字列よりも、利用できるときは(Launch Service frameworkの)UTCoreTypes.hで定義された定数を使用するべきです。たとえば、"com.apple.application"よりも、kUTTypeApplicationを渡すようにしてください。「システム定義のUniform Type Identifier」(21ページ)は、UTI文字列に加えてこれらの定数も一覧にしています。

あなたの独自のUTIを宣言する

もしあなたのアプリケーションが独占【独自の】データフォーマットを用いるのであれば、あなたのアプリケーションバンドルのInfo.plistファイルの中にこれらを宣言する必要があります。

  • あなたのUTI文字列はユニークでなければいけません。com.会社名で始まる逆DNSフォーマットに従うことは、ユニークさを保障するための単純な方法です。システムは同じ仕様を持つ異なるUTI文字列に対応できますが、その逆【同じUTIが複数の仕様を持つ】は真ではありません。
  • もし、あなたのコードが、システム上に存在しないかもしれないサードパーティのUTIタイプに依存しているのであれば、あなたのバンドルの中でこれらのUTIをインポートされるタイプとして宣言する必要があります。
  • もし、あなたの独占タイプが、一つもしくはそれ以上の既存のタイプのサブタイプであれば、必ず【その既存のタイプへの】適合情報を加えるようにしてください。ほとんどの場合、パブリックではないタイプへの適合は、あなたが自分のバンドルの中でもそのタイプを宣言している場合を除けば、指定すべきではありません。パブリックおよびアップルの定義したUTIの一覧は、「システム定義のUniform Type Identifier」(21ページ)を参照してください。

UTI関数の概要

UTIを操作するために用いられる関数は、Launch Services フレームワークの、UTType.h の中で見つけることができます。

一致と適合のための試験を行う

二つのUTIが同一に見えるかどうかを試験するときには、直接文字列を比較するよりも、あなたは常にUTTypeEqual関数を使用すべきです。

Boolean UTTypeEqual (
		CFStringRef inUTI1,
		CFStringRef inUTI2
	);

二つのUTIが等しい場合とは…

  • UTI文字列が同一であるとき
  • 動的識別子のタグ仕様が、もう一方のUTIのタグ仕様の部分集合であるとき

けれども、多くの場合にあなたが必要とするのは、一つのUTIがもう一方と互換性を持つかどうかを判断することであり、この場合にはあなたは一致するかどうかよりも適合性をチェックすべきです…

Boolean UTTypeConformsTo (
		CFStringRef inUTI1,
		CFStringRef inUTI2
	);

UTTypeConformsTo関数は、inUTI1がinUTI2に適合すればtrueを返します。適合性の関係は過渡的【transitive】です。もしAがBに適合し、BがCに適合すれば、AはCに適合します。

タグを操作する

しばしば、UTIを効果的に使用するためには、あなたはさまざまな他のタイプ識別子(OSタイプ、MIME、その他)をUTIへ、またその逆へと変換できる必要があります。

ある識別子をUTIへ変換するには、あなたはUTTypeCreatePreferredIdentifierForTag関数を使用することができます。

CFStringRef UTTypeCreatePreferredIdentifierForTag(
		CFStringRef inTagClass,
		CFStringRef inTag,
		CFStringRef inConformingToUTI
	);

タグクラスには、別種の識別子を定義する、以下のタグクラス定数を渡してください。

const CFStringRef kUTTagClassFilenameExtension;
const CFStringRef kUTTagClassMIMEType;
const CFStringRef kUTTagClassNSPboardType;
const CFStringRef kUTTagClassOSType;

あなたは、与えられたタグが一つ以上のUTI宣言に表れた場合には、ヒントとしてinConformingToUTIパラメータ内にUTIを渡すことができます。

たとえば、もしあなたが、あるファイル名拡張子タグがディレクトリではなくファイルに関連付けられているということを知っていたら、ここにpublic.dataを渡すことができます。その結果、この関数はpublic.directoryに適合する、同じ拡張子を持つあらゆるタイプを無視するということが起こります。

もしヒントがなければ、このパラメータにはNULLを渡してください。

同じ識別子を持つタイプが二つかそれ以上存在するという、まれな場合には、この関数はパブリックUTIを他のものより優先します。もしその識別子のために宣言されたUTIが存在しなければ、UTTypeCreatePreferredIdentifierForTag関数は動的識別子を作成して返します。

もし、あなたが与えられた識別子に対応する、すべてのUTIを取得したいのであれば、UTTypeCreateAllIdentifiersForTag関数を呼んでください…

CFArrayRef UTTypeCreateAllIdentifiersForTag(
	CFStringRef inTagClass,
	CFStringRef inTag,
	CFStringRef inConformingToUTI );

この関数は、あなたがどれを使用するかを決めるために調査することのできる、UTIの配列を返します。

もしあなたが、あるUTIから別種の識別子を作成したければ、UTTypeCopyPreferredTagWithClass関数を呼びます。

CFStringRef UTTypeCopyPreferredTagWithClass(
	CFStringRef inUTI,
	CFStringRef inTagClass );

優先されるタグは、与えられたタグクラスのためのタグ仕様配列内に列挙された、最初のものとなります。

OSタイプ識別子を変換する

UTIユーティリティ関数は、すべての別種識別子タグはCore Foundation文字列として表現されることができるということを前提としています。けれども、OSType型は文字列ベースというより整数ベースであり、CFStringRef型とOSType型の間で正しく変換するにはどうすればよいかを、直ちに明確にすることはできません。エラーフリーなOSタイプのエンコーディング/デコーディングを保障するには、以下の変換関数を使用してください…

CFStringRef UTCreateStringForOSType( OSType inOSType );
OSType UTGetOSTypeFromString( CFStringRef inTag );

注:印刷可能な7ビットACSII文字だけを含んでいるOSタイプ値に対しては、従来通り4文字の文字列リテラルにCFSTRマクロを使用することができます(たとえば、CFSTR ("TEXT") で有効なOSタイプタグを作成できます)。

UTI情報にアクセスする

UTI宣言のコピーを取得するには、UTTCopyDeclaration関数を使用してください…

CFDictionaryRef UTTypeCopyDeclaration(
	CFStringRef inUTI );

与えられたUTIのための宣言を含むバンドルへのURLを取得するには、UTTypeCopyDeclaringBundleURL関数を使用してください…

CFArrayRef UTTypeCopyDeclaringBundleURL(
	CFStringRef inUTI );

与えられたUTIの、各国語化された説明を取得するには、UTTypeCopyDescription関数を呼んでください…

CFStringRef UTTypeCopyDescription(
	CFStringRef inUTI );