2012年12月23日日曜日

sandbox化したアプリからの他のアプリの起動に関する注意点

OS X 10.5以降ファイルの隔離機能が導入され、インターネットからダウンロードした実行ファイルを初めて開くときに、そのファイルを開くかどうかを確認するダイアログが表示されるようになったのはご存知の通りだと思います。アプリケーションをsandbox化した場合、この機能が問題を引き起こします。インターネットからダウンロードされて一度も開かれていない実行ファイルをsandbox化したアプリケーションから起動しようとしても起動できません。回避策はありませんので、ユーザーにFinderで一度その実行ファイルを開いてもらうよう促すしかありません。(OS X 10.7.5/10.8.2で確認)
ファイルの隔離機能は、アプリがダウンロードしたファイルの拡張属性にcom.apple.quarantineプロパティを付加することによって実現されています。この拡張属性を持つファイルを初めてFinderで開こうとすると、ファイルを開くかどうかを確認するダイアログが表示されます。一度ファイルを開くとこのプロパティが削除され、以後、ダイアログは表示されなくなる仕組みです。ターミナルで"xattr ファイル名"コマンドを実行するとこの挙動が確認できるはずです。
通常、拡張属性はremovexattrシステムコールで削除することが可能ですが、sandbox化したアプリケーションからは削除できません。また、Launch ServiceのLSSetItemAttributesコマンドを使っても削除できませんので、回避策がありません。

フレームワークのUTIに関する注意点

Mac OS X 10.7.5で確認したところ、フレームワークのディレクトリ(.framework)はFinder上では通常のフォルダのように内容を見ることができますが、UTI(Universal Type Identifier)上ではpublic.folderの子孫ではなく、public.directory/com.apple.bundle/com.apple.frameworkという関係になっています。ですので、通常のフォルダのように見えるディレクトリなのかどうかを判定するためには
  UTTypeComformTo(uti, kUTTypeFolder) || UTTypeComformTo(uti, kUTTypeFramework)
とする必要があります。なお、ボリュームのUTIであるpublic.volumeはpublic.folderの子孫になっています。