web-dev-qa-db-ja.com

iOS 5では、ダウンロードしたデータをドキュメントディレクトリに保存できませんか?

ターゲットiOSを4にしてクライアント用のアプリケーションを作成しました。
しかし、アプリケーションはまだAppleストアに送信されていないため、クライアントはiOS 5.0用にアップグレードする予定です。

このため、私は Appleからのガイドライン を読み、「ユーザーが生成したデータのみ、または他の方法でアプリケーションで再作成できないものは、/ Documentsディレクトリに保存し、残りは/ Libraryに保存する必要があります。/Cachesディレクトリ」

私のアプリケーションでは、非消耗品のアプリ内購入のサーバーモデルを使用しています。このため、ダウンロードしたすべてのデータ(基本的には本や雑誌)をドキュメントディレクトリに保存しています。データベースは、ダウンロードした製品の詳細が含まれている同じディレクトリにも存在します。

私の質問は、
1。ダウンロードしたデータをドキュメントディレクトリではなく、ライブラリ/キャッシュディレクトリに保存するようにコードを変更する必要がありますか?
2。データベースファイルはどこに配置する必要がありますか(ドキュメントまたはキャッシュ)?

製品をキャッシュに配置した場合、取得のロジックも変更する必要があります。データベースにレコードが存在する場合、ファイルの存在を変更する必要はなく、ユーザーがクリックしたときに直接開くと考えられるためです。雑誌。

この問題について親切に私を導きます。
前もって感謝します。

更新:
この問題についてまだ不明な人のために、これを更新しています。
承認さ​​れた回答のガイドラインを使用して、これを私のアプリケーションの2つに実装し、それらをApple Storeに送信しました。両方ともレビューで承認されました。
これは、受け入れられた回答で提案されたソリューションが正しいことを促進する可能性があります。

50
Naved

トレードオフは次のとおりです。

  • Documentsディレクトリにファイルを置くと、iTunesまたはiCloudにバックアップされますが、ファイルが大きすぎてファイルを再度ダウンロードできる場合は、Appleがアプリを拒否することがあります
  • ファイルをキャッシュディレクトリに置いた場合、それらはバックアップされずバックアップされず、Appleは拒否されません)ただし、iOS 5の空き容量が少なくなると、そこにあるすべてのファイルが削除される可能性があります

ただし、iOS 5.0.1には3番目のオプションがあります。

  • ファイルをドキュメントに入れますが、バックアップしないようにフラグを付けます。これを行う方法についての技術情報( QA1719 )があります。

これがおそらくあなたにとって最良の答えだと思います。

58

1。ダウンロードしたデータをドキュメントディレクトリではなくライブラリ/キャッシュディレクトリに保存するようにコードを変更する必要がありますか? =はい、ダウンロードしたデータをライブラリ/キャッシュディレクトリに保存する必要があります。

2。(ドキュメントまたはキャッシュに)データベースファイルをどこに配置する必要がありますか? =データベースをドキュメントディレクトリに保存できます。

7

このため、私が知っている1つのアプリがかつて拒否されました。ダウンロード可能なデータをドキュメントディレクトリに保存することはお勧めしません。その背後にあるロジックは、データがアプリディレクトリを不必要に膨らませるべきではないということです。このアプリディレクトリはiCloudにバックアップされるため、アプリディレクトリが大きくなると、iCloudに保存されるデータが増えます。

雑誌や本のPDFなど、データを再度ダウンロードできる場合は、キャッシュディレクトリに保存します。もちろん、ユーザーが後で取得できるように、データへのポインタ(URLなど)をドキュメントディレクトリに保存できます。

あなたの質問に答えるには:

  1. はい、ドキュメントからDBをロードし、キャッシュからデータをロードするようにコードを変更します。
  2. ドキュメントにデータベースを保持

アプリが再度ダウンロードする必要がない場合、DB内のドキュメントがキャッシュに存在するかどうかを確認するコードを追加する必要があります。

6

キャッシュディレクトリにデータを保持する必要があるという提案に加えて、データをキャッシュフォルダーに保持する場合は、次の点に注意する必要があります。

IOSがメモリ不足を感じると、すべてのキャッシュと一時フォルダーが削除されます。 問題はここで詳細に説明されています これらのディレクトリを保護し、削除されずにすべてを存続させるには、上記のディレクトリを安全に保つ属性を使用する必要があります。解決策は here:

4
UPT

同じクエリを探していて、解決策を見つけました。 Appleデータストレージのドキュメントによると、ユーザーがメモリ不足の状況でデータを永続化したい場合でも、開発者はデータをキャッシュに保存する可能性があります。開発者はDo not back upフラグを設定するだけです。

Use the "do not back up" attribute for specifying files that should remain on device, 
even in low storage situations. Use this attribute with data that can be recreated but
needs to persist even in low storage situations for proper functioning of your app or 
because customers expect it to be available during offline use. 

This attribute works on marked files regardless of what directory they are in, including      the Documents directory. 
These files will not be purged and will not be included in the user's iCloud 
or iTunes backup. Because these files do use on-device storage space, your app is 
responsible for monitoring and purging these files periodically.

詳細については、このリンクを参照してください

以下のコードを使用して、do not back upフラグを設定します。

import <sys/xattr.h>

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
if (&NSURLIsExcludedFromBackupKey == nil) { // iOS <= 5.0.1
    const char* filePath = [[URL path] fileSystemRepresentation];

    const char* attrName = "com.Apple.MobileBackup";
    u_int8_t attrValue = 1;

    int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0);
    return result == 0;
} else { // iOS >= 5.1
    NSError *error = nil;
    [URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:&error];
    return error == nil;
}

}

URL is the path of Data.

3
Kamar Shad

ターゲットiOSを4にしてクライアント用のアプリケーションを作成しましたが、アプリケーションはまだAppleストアに送信されていないため、iOS 5.0用にアップグレードする予定です。

別のオプション(iOS 5のみをサポートする場合)は、NewsstandKitを使用することです。このようにして、「ディスク」スペースが少なくなると、雑誌の選択された号のみがiOSによって削除されます。私の理解では、iOSは、最後に読んだ時間とおそらくサイズに基づいて、選択した問題を削除します。

ニューススタンドを使用せず、アプリがターゲットに設定されている場合、すべての問題が削除されます。

2
Martin Lockett