UTIって何?
Uniform Type Identifier(UTI)はデータ(エンティティ)のタイプ(種類、型)を一意に識別する文字列である。 Wikipedia
UTI調べてpublic.jpeg
であれば、a.jpegファイルでb.jpgであろうとJPEGファイルということがわかる。
UTI調べて何するの?
作ろうとしていたツールで、NSOpenPanelから拡張子が特定ものだけしか選択できないようにしたかった結果、UTIを指定する必要があった。
Apple独自の拡張子とかは特にUTIがわからないので、困りがち。
movie.mov
はUTIがcom.apple.quicktime-movie
だったりするし…。
なんでCLI作ったん?
プログラムでUTIを調べることは簡単にできたものの、UTI必要になったタイミングでそのプログム毎回buildするの?って思ったら面倒じゃん。何回も調べるかと言われたらわからないけど、terminalでファイルを引数に渡してすぐ調べられた方が楽じゃん。と思って、CLI作った。
CLIの作り方(Swift製)
この2つでほぼ問題なく出来る。
install方法は、make install
でやりたかったので、以前お世話になったSimulatorsを参考に必要部分だけ変更して作成。
上記内容を参考に作っていたけど、release buildしたものを実行しようとすると次のerrorが出て上手くいかなかった(suti
は今回作ったCLIのbin名)
dyld: Library not loaded: @rpath/libswiftCore.dylib
Referenced from: /usr/local/bin/suti
Reason: image not found
調べた結果、buildの仕方が変わって
swift build -c release -Xswiftc -static-stdlib
swift build -c release
となる。
Swift ForumのHow to `Always Embed Swift Standard Libraries`?に書いてあった。
SUTI
そして出来上がったのが、SUTI
(Search Uniform Type Identifierの略)
$ suti ~/Desktop/sample.jpg
UTI is public.jpeg
注意点
- 10行レベルのコードなのでテストコード書いてない
- UTI調べていて、1点問題があって、拡張子の偽装は見抜けない。
元がa.jpeg
のファイルの拡張子を変えてa.png
としてsutiに渡したところ
UTI is public.png
と表示されてしまった。あくまで、拡張子からUTIを判別することしか出来ない。
ただ、これでApple独自の拡張子からUTIを調べられるようになった。