OSX
sandbox

[Mac OS X] Sanbox下のファイルアクセス実装方法

More than 3 years have passed since last update.


はじめに

本文書は、Container Directories and File System Access in App Sandbox Design Guideの(不完全な)翻訳です。Mac OS XにてSandbox対応アプリを開発する上で必要な情報になります。

作成日: 2016/01/14


Container Directories and File System Access

サンドボックスが有効な時、アプリケーションがアクセスできるのは次のディレクトリに制限されます。

種類
説明

App container directory
OSがアプリケーション専用に割り当てるデータ領域です。領域はユーザごとに個別に準備されます。

App group container directories
許可されたアプリケーションで共有します。複数指定可能です

User-specified files
ユーザが明示的にファイル選択する、あるいはドラッグすることでアクセス許可されます。

Related items
上で指定されたファイルと拡張子が異なるファイルにアクセスできます。これにより関連性の高いファイルや、フォーマットが異なる同一コンテンツのファイルにアクセスできます。

Temporary directories, command-line tool directories, specific world-readable locations
その他明示的に定義されたディレクトリに対して様々な制約下でのアクセスを定義できます

次節から各々の詳細について説明します。


App Container Directory


  • アプリケーション専用のホームディレクトリは、NSHomeDirectory関数を呼び出すことで取得できます。

  • 上のディレクトリ、あるいはそのサブディレクトリについては、自由に読み書き可能です。

  • OSXのPosixレイヤ以上のパス検索APIは、アプリケーション専用の特定のパスを参照します。

  • ほとんどのパス検索APIはアプリケーションのコンテナディレクトリからの相対パスに対して機能します。例えば、アプリケーション固有のライブラリは、NSLibraryDirectoryなる定数で定義され、その内部にApplication Supportディレクトリと、Preferencesサブディレクトリを含みます。

  • 幾つかのディレクトリはコンテナディレクトリ外に存在します。例えば、NSTemporaryDirectoryは、コンテナ外に位置しますが、アプリケーションから自由に読み書きできます。なお、sandboxが有効な場合も無効な場合もコードは同じに出来ます。

  • オペレーティングシステム(OSX)は、コンテナディレクトリとアプリケーションを、アプリケーションのシグネチャで紐付けます。

  • コンテナディレクトリ以下のファイルは、ユーザが直接するためのものではありません。その場所は、ユーザから隠されています。同ディレクトリにはキャッシュやデータベース、あるいはアプリケーション固有のファイルを格納します。

アプリケーション固有のコードシグネチャが、他のアプリからの不正アクセスからアプリを守ります。コンテナ情報を再利用する場合は、アプリのバージョンアップ時には、既存のシグネチャを使ってください。コンテナディレクトリは、アプリケーションの初回の起動時にOSによって作成されます。


The Application Group Container Directory

翻訳中


Powerbox and File System Access Outside of Your Container

翻訳中


Related Items

翻訳中


Open and Save Dialog Behavior with App Sandbox

NSOpenPanelメソッドと、NSSavePanelは、Sandboxがイネーブルの場合とそうでない場合で挙動が異なります。Sanboxがイネーブルの場合、以下の処理が不可能です:



  • ok:メソッドを使って、OKボタンを押した状態にすること。


  • NSOpenSavePanelDelegateデリゲートのpanel:userEnteredFilename:confirmed:メソッドを用いて、ユーザが選択したファイルのパスを書き換えること

Sandbox対応のため、NSOpenPanelNSSavePanelは、そのサブクラスのメソッドの一部を継承していません。コンパイラは継承していないメソッドの検出ができないため、これらを呼び出した場合は、実行時に例外が発生します。


Security-Scoped Bookmarks and Persistent Resource Access

コンテナディレクトリ外のファイルにアクセスするためには、先に述べたユーザの明示的なファイル指定が必要ですが、アプリケーションを再起動すると、アクセス許可が失われてしまいます(ただし、アプリケーションがファイルを開いている状態で、そのアプリケーションが強制終了された場合、該当するファイルはアプリケーション再起動時にオープンできます。)

OSX v10.7.3以降のシステムでは、security-scoped bookmarksなるセキュリティ機構が導入されました。これによりアクセス許可をアプリケーション終了後も保持することができます。

以下にその活用例を挙げます:


  • ユーザがダウンロードしたファイル、処理中のファイルあるいは生成したファイルへのアクセス

  • ユーザが指定した画像ファイルのアクセス

  • ドキュメント中に記載された別ファイルへのアクセス


Two Distinct Types of Security-Scoped Bookmark

Security-scoped bookmarksは、Mac OS X v10.7.3から利用可能です。次の2つのユースケースをサポートします。



  • app-scoped bookmark : ユーザが指定したファイル/フォルダの永続的なアクセスをサポートします。ユーザが指定するファイル/フォルダの最初のアクセスは、NSOpenPanelによって行われます。ユーザが指定したファイルの置かれているフォルダを記録する(通常NSUserDefaultsの1つのプロパティとして記録します)事で、app-scoped bookmarkを実装することができます。


  • document-scoped bookmark : 例えば、ビデオ編集ソフトのプロジェクトファイルには、外部のファイルへの参照が含まれています。これは、プロジェクトファイルがそれら外部ファイルへの永続的アクセスをするための、Security-scoped bookmarksを持たなければならないことを意味します。


Using Security-Scoped Bookmarks

Security-scoped bookmarksを使用するためのステップを以下に挙げます。

1. Xcodeのプロジェクトにて、 Security-scoped bookmarksを使うための制約(entitlement)を設定してください。

2. ユーザがOpenPanelやSavePanelで指定したファイルのうち、永続化が必要なものについては、URLからブックマークを生成します。

3. アプリケーションが再起動した場合などに、上のステップで保存したブックマークを取り出し、Securty scoped URLを取り出します

4. ステップ3で取得した URLをもとにファイルを読み込みます。

5. ファイルの読み込みが終わったら、アクセス権を返還してください

6. アプリケーション再起動時には、ステップ3から開始してください。