OS X パッケージ (およびバンドル)は通常、拡張子によって定義されます。拡張子を付けてディレクトリを作成するだけ.app
で、Finder で (壊れた) アプリケーションとして表示されます。
公式ドキュメントには、バンドルを定義する次の方法がリストされています。
次の条件のいずれかに該当する場合、Finder はディレクトリをパッケージと見なします。
- ディレクトリには、.app、.bundle、.framework、.plugin、.kext などの既知のファイル名拡張子が付いています。
- ディレクトリには、他のアプリケーションがパッケージ タイプを表すと主張する拡張子があります。「ドキュメント パッケージ」を参照してください。</li>
- ディレクトリにはパッケージ ビットが設定されています。
パッケージを指定する推奨される方法は、パッケージ ディレクトリに既知のファイル名拡張子を付けることです。ほとんどの場合、Xcode は正しい拡張子を適用するテンプレートを提供することで、これを処理します。適切なタイプの Xcode プロジェクトを作成するだけです。
パッケージを検出する最も簡単な方法は、それらの拡張子を検出することです。手っ取り早い方法は、上記のドキュメントをガイドとして使用して、ハードコードされた拡張機能のリストを探すことです。
次のステップは、特定の拡張機能がドキュメント パッケージとして登録されているかどうかを OS に問い合わせることです。特定の拡張子を持つディレクトリが Finder によってパッケージとして表示されるかどうかを確認する方法を参照してください。
ディレクトリのパッケージ ビットを検出するには、xattr
ライブラリu'com.apple.FinderInfo'
を使用してキーを取得し、Finder.h
ヘッダー情報を使用して返されたバイナリ データをデコードする必要があります。kHasBundle
フラグは 0x2000 です:
attrs = xattr.getxattr('/path/to/dir', u'com.apple.FinderInfo')
ispackage = bool(ord(attrs[8]) & 0x20) # I *think* this is correct; works for hidden dirs and & 0x40