UTI(均一なタイプ識別子)が与えられた場合、それが適合するすべてのタイプを見つけます
-
29-09-2019 - |
質問
私はそれを利用するアプリケーションを書いています 均一なタイプ識別子. 。具体的には、私は呼んでいます UTTypeCreateAllIdentifiersForTag()
そしてそれをさまざまに渡します マイム タイプ。
私の希望は、この機能(とは異なるものとして UTTypeCreatePreferredIdentifierForTag()
)最も具体的なUTIと、それが適合するすべてのUTIを私に与えます。これは事実ではないように見えます - 単一のUTIを返すか、二次UTIが偽物であるかのいずれかです。
そこには UTTypeConformsTo()
同じヘッダーファイルで定義された関数ですが、このUTIが適合するすべてのタイプの配列を返す関数を好みます。
私には希望があるようです MDItemCopyAttributeList()
そのようなリストを返します。とはいえ、それは必要です MDItemRef
, 、ファイルパスまたはURLのいずれかから作成できますが、これはあまり良くありません。時々、私のデータはメモリ内でのみ保存され、私は通り過ぎるマイムタイプしか持っていません。
この情報を取得するには、UTIのデータベース全体を繰り返す必要がありますか、それとも何かが足りませんか?
解決
私は確かに何かを見逃していました:非常に明白な解決策。私がエクスポートされたシンボルをトロールしている間 LaunchServices
(そして、興味深いがプライベートに気づいた UTTypeCopyPedigree()
)、私は思い出しました UTTypeCopyDeclaration()
, 、 どれの は 定義されています。
UTTypeCopyDeclaration()
UTIが与えられ、戻ります( CFDictionaryRef
)UTIが定義されたプロパティリスト。この辞書のオブジェクトはキーを使用しています kUTTypeConformsToKey
どちらかです CFArrayRef
また CFStringRef
. 。配列の場合、ベースタイプに達するまで再帰的に反復することができます。
これが、特定のUTIの継承ツリーを構築する方法です。これが同じ問題を抱えている他の人に役立つことを願っています。
他のヒント
https://github.com/nst/utisexplorer GraphVizの「DOT」形式でUTIの階層グラフを生成します。