読者です 読者をやめる 読者になる 読者になる

Mac や iOS でファイルの種類を表す識別子 Uniform Type Identifiers を拡張子から調べる(Swiftで1行で出来る)

Uniform Type Identifiers とは?

Uniform Type Identifier - Wikipedia

Uniform Type Identifier(UTI)はデータ(エンティティ)のタイプ(種類、型)を一意に識別する文字列である。アップルコンピュータMac OS X v10.4 から追加され[1]、Spotlight などでファイルやフォルダ、クリップボードのデータ、バンドル、エイリアスシンボリックリンク、ストリーミングデータなどを識別するのに利用されている。UTIはドメイン名を逆さにした構造をしている。また、UTIはマルチメディアファイルが(MIME のように)単一のタイプに識別されないように 多重継承を採用している。つまり1つの識別子は例えば public.audio、public.video、public.text、public.image など複数の識別子を継承できる。

Apple の公式ドキュメント

どのファイルがどのような Uniform Type Identifiers なのか、Appleの以下のサイトで公開されている。

developer.apple.com

公式に網羅されていない Uniform Type Identifiers が存在する

しかし上記のページにあらゆる種類の Uniform Type Identifiers が掲載されているわけではない。

アプリケーションが開くことが出来るファイルを Document types に指定したい場合や、Action Extesion の NSExtensionActivationRuleカスタムの Predicate Query を設定して Action Extension が開く条件となるファイルタイプを指定したい場合などに、Uniform Type Identifiers が分からず困った。

コードを書いたら拡張子から一発で Uniform Type Identifiers を調べられる

さんざん調べまわって求めていた Uniform Type Identifiers は発見したが、そのあと、コードを書けば一発で調べられることが分かった。次の人のために記録しておく。

if let str = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, "xlsx", nil)?.takeUnretainedValue() {
    print("\(str)") // org.openxmlformats.spreadsheetml.sheet
}

一瞬で分かった...

そしてさらに:UTIをSwiftで扱うためのライブラリ

この記事を公開したら同僚の @cockscomb さんが自作のライブラリを教えてくれました。こんなのあったのか!

どうぞご利用ください。