15

iOS アプリの .app バンドル内に実行時に生成されたファイルをいくつか保存します。シミュレーターでは問題なく動作しますが、デバイスではクラッシュします:

指定されたシェーダー キャッシュ パス「/var/mobile/Applications/CB064997-B40E-4FE3-9834-B3217CE33489/SimedTest.app/Ogre3D/assets/RTShaderLib/cache/」に出力ファイルを作成できます

ドキュメント、ライブラリ、tmp などの使用方法など、ファイルを配置すべき場所と配置すべきでない場所についての概要はありますか?

明確にするために、これらは起動時に作成されるファイルであり、時間を節約するために一部のデータを事前に計算します。それらが存在しない場合は作成されるため、削除しても問題ありませんが、アプリの実行中は削除されません。

4

2 に答える 2

19

バンドルは読み取り専用です。次の 2 つの理由から、これをいじりたくはありません。

  • コード署名: 署名は、バンドルの内容に対して検証されます。バンドルをいじると、署名が壊れます。
  • アプリの更新: 更新は、アプリ バンドル全体を新しくダウンロードしたものに置き換えることで機能します。行った変更はすべて失われます。

保存する場所:

  • ドキュメント: 保持してバックアップする場合
  • ライブラリ/キャッシュ: プロフィール写真など、ダウンロードしたデータをキャッシュするだけの場合。特別な do-not-delete フラグを指定しない限り、空き容量が少ない場合、システムによって自動的に削除されます。
  • tmp: アプリが実行されていないときに削除される一時ファイル

詳細な説明については、File System Programming GuideおよびQA1719を参照してください。

于 2012-10-01T19:14:04.987 に答える
4

いいえ、バンドルを変更するたびに署名が無効になります。

ファイルを書きたい場合は、そのファイルで何をしたいかによって、最適なフォルダーに書き込む必要があります。

  1. 長期間のファイル用のドキュメント フォルダ
  2. 小さな操作のためのキャッシュ
  3. 等々

編集

を取得するには、次のpathようなものが必要です。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"filename.ext"];

これにより、path次のように書いたり読んだりできます。

書きます:

NSString *content = @"One\nTwo\nThree\nFour\nFive";
[content writeToFile:fileName atomically:NO encoding:NSStringEncodingConversionAllowLossy error:nil];

読んだ:

NSString *content = [[NSString alloc] initWithContentsOfFile:fileName usedEncoding:nil error:nil];
于 2012-10-01T19:10:43.540 に答える