LoginSignup
5
2

More than 3 years have passed since last update.

UTIを調べるCLIツールをSwiftで作ったメモ書き

Posted at

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の仕方が変わって

❌before
swift build -c release -Xswiftc -static-stdlib
⭕️after
swift build -c release

となる。

Swift ForumのHow to `Always Embed Swift Standard Libraries`?に書いてあった。

SUTI

そして出来上がったのが、SUTI(Search Uniform Type Identifierの略)

example
$ suti ~/Desktop/sample.jpg
UTI is public.jpeg

注意点

  • 10行レベルのコードなのでテストコード書いてない
  • UTI調べていて、1点問題があって、拡張子の偽装は見抜けない。

元がa.jpegのファイルの拡張子を変えてa.pngとしてsutiに渡したところ

UTI is public.png

と表示されてしまった。あくまで、拡張子からUTIを判別することしか出来ない。

ただ、これでApple独自の拡張子からUTIを調べられるようになった。

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2