iPhoneで書き込み可能なパスを取得するにはどうすればよいですか?
質問
私はこの質問を投稿しています。なぜなら、この質問に対する完全な回答を別の投稿用に書き出したのですが、それが元の投稿には当てはまらないことがわかったからです。しかし、あまりにも有用なので、無駄にすることはできないと思いました。 そのため、私はこの質問をコミュニティ 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 を添付することもできません。
関連
-
[解決済み] 1つのディレクトリにいくつまでファイルを置くことができますか?
-
[解決済み] iPhone 5の画面解像度に対応したアプリを開発・移行するには?
-
[解決済み] C#で現在のユーザーのデスクトップへのパスを取得する方法は?
-
[解決済み] iOSの配布証明書の正しい更新方法
-
[解決済み] iOSシミュレータでファイルシステムを確認する方法はありますか?
-
[解決済み] iphone Core Data 保存時に未解決のエラーが発生する。
-
[解決済み] モバイルSafari(iPhone)でテキストエリアのインナーシャドウを除去する
-
[解決済み] iphoneシミュレーターでキーボードを使うにはどうしたらいいですか?
-
[解決済み] CALayerのanchorPointを変更すると、ビューが移動します。
-
[解決済み] Xcode 3.2.3 with iPhone SDK 4をインストールすると、「Base SDK missing」と表示され、他のSDKが表示されない。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 私のアプリケーションは「暗号を含む」のでしょうか?
-
[解決済み】「推奨アイコンファイルがありません - バンドルには、ちょうど「120x120」ピクセル、.png 形式の iPhone / iPod Touch 用のアプリアイコンが含まれていません。
-
[解決済み] UIPageControlのページネーションドットの色を変更するにはどうしたらよいですか?
-
[解決済み] UITableViewCellのサブビューがセルを選択すると消えてしまう
-
[解決済み] UITableViewHeaderFooterView。背景色を変更できない
-
[解決済み] 静的ライブラリのObjective-Cカテゴリ
-
[解決済み] インスタンスからクラス名を取得する
-
[解決済み] リンカーフラグ -ObjC は何をするのですか?
-
[解決済み] cocoaアプリケーションのinfo plistにある「bundle display name」と「bundle name」の違いは何ですか?
-
[解決済み] Objective-Cのプロトコルでプロパティを含むものはどう扱えばいいのか?