OS X 包(和捆绑包)通常由它们的扩展名定义。只需创建一个带有.app
扩展名的目录,即可在 Finder 中将其显示为(损坏的)应用程序。
官方文档列出了以下定义捆绑包的方法:
如果满足以下任一条件,则 Finder 将目录视为一个包:
- 该目录具有已知的文件扩展名:.app、.bundle、.framework、.plugin、.kext 等。
- 该目录有一个扩展名,其他一些应用程序声称它代表一个包类型;请参阅“文档包”。</li>
- 该目录设置了其包位。
指定包的首选方法是为包目录指定一个已知的文件扩展名。在大多数情况下,Xcode 会通过提供应用正确扩展的模板来为您解决这个问题。您所要做的就是创建一个适当类型的 Xcode 项目。
检测包的最简单方法是检测这些扩展。快速而肮脏的方法是使用上述文档作为指南,简单地查找硬编码的扩展列表。
下一步是查询操作系统是否已将给定的扩展注册为文档包。请参阅如何检查 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