1. ホーム
  2. iphone

iPhoneで書き込み可能なパスを取得するにはどうすればよいですか?

2023-10-31 15:55:45

質問

私はこの質問を投稿しています。なぜなら、この質問に対する完全な回答を別の投稿用に書き出したのですが、それが元の投稿には当てはまらないことがわかったからです。しかし、あまりにも有用なので、無駄にすることはできないと思いました。 そのため、私はこの質問をコミュニティ wiki にし、他の人が質問と回答 (複数可) に肉付けできるようにしました。 もしその答えが有用だと思ったら、その質問に投票してください - コミュニティウィキなので、この投票にポイントはつかないはずですが、他の人がそれを見つけるのに役立つでしょう。

iPhone 上でファイルの書き込みが許可されているパスを取得するにはどうすればよいですか? Simulator では (誤解を招くかもしれませんが)どこにでも書き込むことができますが、iPhone では特定の場所にしか書き込むことができません。

どのように解決するのですか?

考慮すべき書き込み可能なパスは 3 種類あります。1 つ目は Documents で、iTunes を通じてユーザーが利用できるようにしたいものを保存します (3.2 現在)。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

ここには、設定ファイルや書き込み可能なデータベースなど、iTunes を通してユーザーに操作されたくないものを保存します。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *libraryDirectory = [paths objectAtIndex:0];

3.2 より古いデバイス (iPad) を使用してユーザーが iTunes でファイルを見ることができない場合でも、NSLibraryDirectory 定数は iPhoneOS 2.0 から利用可能であるため、3.0 (またはまだそれを行っている場合はそれ以前) をターゲットとしたビルドに使用できることに注意してください。 また、ユーザーがドキュメントを変更できるようにアプリにフラグを立てない限り、ユーザーは何も見ることができないので、現在ドキュメントを使用している場合は、ユーザー ドキュメントのサポートのためにアップデートするときに場所を変更すれば問題ありません。

最後にキャッシュディレクトリがあり、長期的に存在するかどうか気にしない画像を置くことができます (携帯電話はある時点でそれらを削除する可能性があります)。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachePath = [paths objectAtIndex:0];
BOOL isDir = NO;
NSError *error;
if (! [[NSFileManager defaultManager] fileExistsAtPath:cachePath isDirectory:&isDir] && isDir == NO) {
    [[NSFileManager defaultManager] createDirectoryAtPath:cachePath withIntermediateDirectories:NO attributes:nil error:&error];
}

ちなみに、Cachesディレクトリは実際にそこに作成しなければならないので、書き込みの際は毎回確認して作成する必要があります!ちょっと面倒ですが、そういうものです。 ちょっと面倒ですが、そういうことです。

で、書き込み可能なパスができたら、そこにファイル名をつけていくだけです。

NSString *filePath =  [documentsDirectory stringByAppendingPathComponent:@"SomeDirectory/SomeFile.txt"];

または

NSString *filePath =  [cachePath stringByAppendingPathComponent:@"SomeTmpFile.png"];

読み書きにそのパスを使用します。

これらの書き込み可能なパスのいずれかにサブディレクトリを作ることができることに注意してください。上の例の文字列のいずれかが使用されています(1つが作成されていると仮定しています)。

フォトライブラリに画像を書き込もうとする場合、ファイルシステムコールを使用することはできません。 UIImageWriteToSavedPhotosAlbum() 関数呼び出しを使用する必要があります。 この方法では、保存先の形式や圧縮レベルを制御することはできず、EXIF を添付することもできません。