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

UTIのお話

今回は、iOSOS X上でファイル・データを識別するための仕組み、UTIについてです。

UTIとは

UTIとは

UTI(Uniform Type Identifier)とは、システム内で扱うファイル・データをユニークに識別するための識別子です。
例えば、

  • ファイル拡張子.png
  • MIMETypeのimage/png

を、public.png というUTIで表現することができます。
そして、UTI/ファイル拡張子、UTI/MIMETypeを相互変換する関数が用意されているため、 UTIさえわかっていれば、ファイル拡張子やMIMETypeといった情報を保持する必要がなくなるという便利なものなのです。

UTIの構造

更に、UTIは全体として以下のような階層構造になっています。
そのため、AはBか(例:public.pngは画像か)といった問題については、 AがBのUTIを継承しているか(public.pngpublic.imageを継承しているか)を確認することで 答えを得ることができます。
そのため、処理対象のファイルが追加になっても、ほとんど実装を修正する必要がない、というのがUTIを使用するメリットとして挙げられます。

f:id:nerd0geek1:20160117102813g:plain

出典:Uniform Type Identifier Concepts

UTIの取得方法

UTIは、ローカルに存在するファイル、リモートのファイル、どちらについても利用することができますが、取得方法が異なります。

ローカルの場合

class func UTITypeAtLocalFileURL(url: NSURL) -> CFStringRef? {
        do {
            var UTIType: AnyObject? = nil
            try url.getResourceValue(&UTIType, forKey: NSURLTypeIdentifierKey)
            return UTIType as? String as CFStringRef?
        } catch let error as NSError {
            return nil
        }
}

リモートの場合

class func UTITypeAtRemoteFileURL(url: NSURL) -> CFStringRef? {
        return UTTypeCreatePreferredIdentifierForTag(
            kUTTagClassFilenameExtension,
            url.absoluteString.pathExtension, nil)?.takeRetainedValue()
}

注意点

リモートのURLからUTIを取得する場合、
http://sample.com/hogehoge.mp4?fuga=fuga
のようにパラメータが存在しているとUTIの取得に失敗するので、
http://sample.com/hogehoge.mp4
とする必要があります。

参考