iOS のサンドボックスの使い方 : Objective-C プログラミング

PROGRAM


iOS のサンドボックスの使い方

iPhone や iPad では、各アプリにはそのアプリ専用の "サンドボックス" と呼ばれるディスク領域などの区画が与えられます。

これによって、アプリが他のアプリのデータに勝手にアクセスしないように保護されています。

 

この、サンドボックスの中で、アプリが扱っていい場所とそこに保存していい内容は、次のようになっているようです。

ホームからの場所 バックアップ対象 取得で使う変数 用途:保存できる内容
Documents/ NSDocumentDirectory 文書データなどを保存するために自由に使用して良いディレクトリです。このディレクトリの内容は "Application supports iTunes file sharing" を有効にすると、iTunes から読み書きできるようになります。
Library/ ○ / Caches ディレクトリを除く NSLibraryDirectory 文書データなどのファイル以外を保存するディレクトリです。iTunes から見られたくないような内部データをおくならここになりそうです。
Library/Preferences   アプリケーション設定ファイルを保存します。ここに限っては NSUserDefaults や CFPreferencesAPI を使ってデータの読み書きを行うことになるようです。
Library/Caches × NSCachesDirectory Library ディレクトリに保存するファイルのうち、バックアップを取る必要がないもの、または撮りたくないものはここにおくのが良さそうです。デバイスのリストアを行ったときに、リストアして欲しくないデータファイルもここに置くと良さそうです。
tmp/ ×   一時的に使用するファイルを保存します。基本的に、ここに保存したファイルは長く使ってはいけなくて、場合によってはアプリが終了しているときに iOS が削除することもあるそうです。

ちなみにこれらのディレクトリは、アプリケーションごとに割り当てられたホームディレクトリに用意されます。

 

これらのパスを取得したい場合には、次のように NSSearchPathFordirectoriesInDomains 関数を使います。

// たとえば Documents ディレクトリを取得します。

NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

 

// 指定した内容によっては複数のパスが取れることがあるらしく、配列で取得できるようになっています。

if (paths.count > 0)

{

// Documents ディレクトリであれば、取得できた最初の要素がパスになります。

NSString* path = [paths objectAtIndex:0];

}

ホームディレクトリそのものを取得したい場合は、NSSearchPathForDirectoriesInDomains 関数で NSApplicationDirectory を指定すれば良いようでした。

 

また、tmp ディレクトリは、NSSearchPathForDirectoriesInDomains は使わずに、次の関数を使う感じになります。

// たとえば Documents ディレクトリを取得します。

NSString* path = NSTemporaryDirectory();

このようにすることで、tmp フォルダが取得できました。

ただ、シミュレーターと実機とではフォルダの場所が異なるようでしたので、デバッグの際は注意が必要になることもあるかもしれません。

 

サンドボックスの外のディレクトリについては、iOS では読み書きが禁止されているとのことなので、必ずこのサンドボックスのルールに従ってプログラムを作成して行く必要があります。

ちなみに、アプリ間でデータの受け渡しを行う方法としては、"ペーストボード (NSPasteBoard)" や "カスタム URL スキーム" などがあるようです。

ただ、iOS では NSPasteBoard がなさそうなので、アプリの Info.plist でカスタム URL スキームを登録して、別アプリからそれを呼び出す感じになるようでした。

[ もどる ]