UTExportedTypeDeclarations とは?UTI宣言の仕組みとInfo.plistへの書き方を解説

「自作アプリの独自ファイルをFinderやFilesアプリで正しく認識させたい」「拡張子 .mydata のファイルをダブルクリックしたら自分のアプリが開くようにしたい」——こういった要件を実現するのが UTExportedTypeDeclarations です。
これはAppleが定めた Uniform Type Identifier(UTI) という仕組みの一部で、macOS / iOS 向けアプリの Info.plist に記述します。
この記事では UTI の基本概念から始め、UTExportedTypeDeclarations の役割・書き方・UTImportedTypeDeclarations との使い分けまでを体系的に解説します。


スポンサーリンク

Uniform Type Identifier(UTI)とは

UTI とは、macOS / iOS がファイルやデータの種類を識別するために使う文字列識別子です(Apple Developer Documentation「UTType」)。
Mac OS X 10.3(Panther)で導入されました。

従来のファイル識別方法には次のような問題がありました。

  • ファイル拡張子:同じ .txt でもUTF-8とShift-JISの区別ができない
  • MIMEタイプ:アプリによって表記揺れがある(image/jpgimage/jpeg など)
  • OSType(4文字コード):Classic Mac OS 時代の遺産でモダンな用途に向かない

UTI はこれらを統一する文字列で、逆引きドメイン名形式(reverse-DNS形式)で記述します(Uniform Type Identifier – Wikipedia)。

種類UTI 文字列
JPEG画像public.jpeg
PDFドキュメントcom.adobe.pdf
ZIP圧縮ファイルpublic.zip-archive
独自フォーマット(例)com.yourcompany.yourapp.document

UTIの階層(コンフォーマンス)

UTI は親子関係(コンフォーマンス)を持つ点が特徴です(Apple Developer「Uniform Type Identifiers Overview」)。
例えば public.jpegpublic.image に準拠し、public.imagepublic.data に準拠しています。
この階層があるため「JPEGを開けるアプリ」も「画像全般を開けるアプリ」も、同じファイルを正しく処理対象として認識できます。


UTExportedTypeDeclarations とは

UTExportedTypeDeclarations は、自分のアプリ(または組織)が所有・管理する独自ファイルタイプを、システム全体に宣言するための Info.plist キーです(Apple Developer Documentation「UTExportedTypeDeclarations」)。

「エクスポート(Exported)」という名前が示す通り、このキーで宣言した UTI は他のアプリからも参照・利用可能になります。
自分が作ったファイルフォーマットの「所有者(Owner)」として登録する際に使います。

具体的な用途としては次のようなケースが代表的です。

  • 自作アプリ専用の独自フォーマット(例:.mydata)を新規定義したい
  • Finderやファイルピッカーでカスタムアイコンやファイル名を表示させたい
  • 他のアプリが自分のフォーマットを参照できるようにしたい

UTImportedTypeDeclarations との違い

UTExportedTypeDeclarations と対になるキーが UTImportedTypeDeclarations です。
2つの使い分けはそのUTIの「所有者」が誰かで決まります(Apple Developer「Declaring New Uniform Type Identifiers」)。

キー意味使うケース
UTExportedTypeDeclarations自分が所有するUTIを宣言・公開する自作フォーマット、自社独自拡張子
UTImportedTypeDeclarations他者が所有するUTIをシステムに教える競合アプリや他社フォーマットをサポートしたいが、相手のアプリが未インストールの可能性がある場合

インポートは暫定的な宣言です。
もし宣言の対象アプリ(本来の所有者)がインストールされていれば、そちらの宣言が優先されます(Apple Developer Forums「Defining custom file types」)。


Info.plist への書き方

基本構造

UTExportedTypeDeclarations の値は配列(Array)で、各要素は辞書(Dictionary)です。
1つの辞書が1つのUTI宣言に対応します。

<key>UTExportedTypeDeclarations</key>
<array>
    <dict>
        <!-- 必須:UTI の識別子文字列 -->
        <key>UTTypeIdentifier</key>
        <string>com.yourcompany.yourapp.document</string>

        <!-- 必須:親UTI(何に準拠するか) -->
        <key>UTTypeConformsTo</key>
        <array>
            <string>public.data</string>
        </array>

        <!-- 推奨:拡張子やMIMEタイプとのマッピング -->
        <key>UTTypeTagSpecification</key>
        <dict>
            <key>public.filename-extension</key>
            <array>
                <string>mydata</string>
            </array>
            <key>public.mime-type</key>
            <array>
                <string>application/x-yourcompany-document</string>
            </array>
        </dict>

        <!-- 省略可:Finderで表示されるファイルの説明文 -->
        <key>UTTypeDescription</key>
        <string>My App Document</string>
    </dict>
</array>

主なキーの説明

キー必須説明
UTTypeIdentifier必須UTIの一意識別子。com.会社名.アプリ名.形式名 の形式で命名
UTTypeConformsTo必須親UTI。テキスト系なら public.text、それ以外は public.data が基本
UTTypeTagSpecification推奨拡張子・MIMEタイプ・OSTypeのマッピング
UTTypeDescription省略可Finderやファイルピッカーに表示されるユーザー向け説明文
UTTypeIconFile省略可カスタムアイコンファイル名(.icnsResources フォルダに配置)
UTTypeReferenceURL省略可フォーマット仕様を説明する参照URL

UTTypeConformsTo の選び方

UTTypeConformsTo に指定するUTIは、自分のフォーマットの性質に合わせて選びます。

自分のフォーマットの種類指定推奨の親UTI
人間が読めるテキストpublic.plain-text または public.text
XML形式のデータpublic.xml
バイナリデータ(独自仕様)public.data
ZIP互換アーカイブpublic.zip-archive
画像ファイルpublic.image

なお、ファイルフォーマットの場合は必ず public.data または com.apple.package のどちらかがコンフォーマンス階層のルートに含まれるようにしてください。
そうしないとシステムがディスク上のアイテムとして正しく認識できません(Apple Developer「Declaring New Uniform Type Identifiers」)。


CFBundleDocumentTypes との組み合わせ

UTExportedTypeDeclarations でUTIを宣言しただけでは、「このアプリがそのファイルを開ける」とはシステムに伝わりません。
ファイルを開く対応を宣言するには、CFBundleDocumentTypes キーも併せて設定する必要があります(Apple Developer Forums「Defining custom file types」)。

<key>CFBundleDocumentTypes</key>
<array>
    <dict>
        <key>CFBundleTypeName</key>
        <string>My App Document</string>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>        <!-- Editor(読み書き)or Viewer(読み取りのみ) -->
        <key>LSHandlerRank</key>
        <string>Owner</string>         <!-- 自分が所有者なので Owner -->
        <key>LSItemContentTypes</key>
        <array>
            <string>com.yourcompany.yourapp.document</string>
        </array>
    </dict>
</array>

LSHandlerRank の値は次の意味を持ちます。

意味
OwnerこのUTIの所有者。UTExportedTypeDeclarations と組み合わせる際に使う
Default既定の処理アプリ候補として登録
Alternate代替アプリとして登録(他のアプリが優先)
Noneランクなし(Open With候補には出ない)

Xcode での設定方法

コード直接記述でなく、Xcodeのビジュアル設定画面でも同じ内容を設定できます。

  1. Xcodeでプロジェクトを開き、対象のターゲットを選択
  2. Info」タブを開く
  3. 「Exported Type Identifiers」(= UTExportedTypeDeclarations)セクションを展開、または「+」ボタンで追加
  4. 各フィールドに UTTypeIdentifierUTTypeConformsToUTTypeTagSpecification などを入力

Xcode 12 以降では、UTExportedTypeDeclarations で宣言したカスタムUTIを UniformTypeIdentifiers フレームワークの UTType として Swift コードから直接参照できます(Apple Developer Tech Talk「Uniform Type Identifiers — a reintroduction」)。

import UniformTypeIdentifiers

extension UTType {
    // Info.plist の UTTypeIdentifier と同じ文字列を指定
    static let myDocument = UTType("com.yourcompany.yourapp.document")!
}

注意点

ドキュメントの「obsolete」警告について

Apple公式ドキュメントの一部には「このドキュメントは更新されていない」という警告が表示されています。
ただし UTExportedTypeDeclarations キー自体は引き続き有効で、Xcode 16 以降でも標準的な設定方法として使われています(Apple Developer Forums「Uniform Type Identifiers」)。

UTIの一意性

UTI文字列はグローバルに一意である必要があります。
com.apple.*public.* などAppleが管理するドメインは使用できません。
必ず com.会社名.*jp.会社名.* など自社が管理するドメインをルートに据えた命名にしてください(Apple Developer「Declaring New Uniform Type Identifiers」)。

Windows レジストリとの関係

UTExportedTypeDeclarationsmacOS / iOS 固有の仕組みです。
機能的な目的(ファイルの関連付けとアプリ登録)はWindowsのHKEY_CLASSES_ROOT配下の拡張子キー・ProgIDキーと似ていますが、実装場所・形式・スコープは異なります。


まとめ

UTExportedTypeDeclarations は、macOS / iOS アプリが自分自身の所有する独自ファイルタイプをシステムに公開宣言するための Info.plist キーです。
UTTypeIdentifier(識別子)・UTTypeConformsTo(親UTI)・UTTypeTagSpecification(拡張子やMIMEタイプとのマッピング)の3点セットが基本構造になります。
他者が定義したフォーマットを「このアプリも開ける」と補助的に宣言したい場合は、代わりに UTImportedTypeDeclarations を使うのが正しい使い分けです。
宣言後は CFBundleDocumentTypes と組み合わせることで、はじめてファイルのオープン処理がアプリと紐づきます。


参考情報源:

コメント

タイトルとURLをコピーしました