2016-03-29 12 views
7

私は、アプリケーションストアに、オフラインで使用するためにデバイスに留まる必要のある比較的大きなファイルをダウンロードできるiOSアプリケーションを持っています。これらのファイルは現在、アプリケーションのDocumentsフォルダに保存されていますが、今はDocumentsフォルダがバックアップされていることを読んでいます。実際には、ユーザが作成したコンテンツにのみ使用する必要があります。 This Apple technical Q&Aには、バックアップを防止するためにNSURLIsExcludedFromBackupKeyを設定する必要があると記載されています。 Thisは、アプリの/Library/Cachesは、この種のファイルを置くのに適していると述べていますが、このアプリでは受け入れられないストレージにデバイスがないときにフォルダが消去される可能性があります。私は/Library/Application Support/がそれらのための最良の場所だと信じています - これは正しいですか?大きなファイルがDocumentsにダウンロードされ、iCloudにバックアップされる

残念ながら、この間違いはアプリの審査プロセスを通過しました。人々がこのアプリを使用していて、既にDocumentsフォルダとそのバックアップに保存されているファイルがあるので、これを修正するためのベストプラクティスは何ですか?既存のファイルをすべて移動し、アプリのアップデートでNSURLIsExcludedFromBackupKeyを設定する必要があるようです。これが一度だけ行われ、中断されないことをどうすれば保証するのですか?ファイルをDocumentsフォルダから移動することは重要ですか、そこに残すことができますか?ファイルのバックアップ状態を変更すると、既存のバックアップからそれらのファイルが削除されますか?

私はSwift 2.1.1を使用し、iOS 8.0+をターゲットにしています。

答えて

2

テクニカルQ & Aに記載されているように、ドキュメント内にサブディレクトリを作成し、そのサブディレクトリを一度除外することができます。

+0

ありがとう、@アレン。ファイルは既に1つのフォルダに入っていたので、私はそれらを除外して、アプリのレビューを終えました。 [NSURLのドキュメント](https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/#//apple_ref/doc/constant_group/Common_File_System_Resource_Keys)には、「一般的な操作ユーザードキュメントにこのプロパティをfalseにリセットさせるため、私の懸念しているユーザードキュメントにこのプロパティを使用しないでください。今のところ、すべてのアプリの起動時にディレクトリを除外していますが、理想的ではありません。 –

+0

あなたが使用しようとしているサブディレクトリではなく、Documentsフォルダに適用される心配はありません。また、iOSでは、他の誰もあなたのアプリケーションの環境にアクセスできません。 – Allen

+0

ファイルをDocumentsフォルダに残しておき、ファイルの状態を変更して既存のバックアップから削除するかどうかなど、詳細を追加することができることを確認するソースを追加することができます。 –

2

実行中にアプリがクラッシュすることを保証できないため、「一度やってください」と書くことはできません。確かに完了フラグがセットされていることが確かめられたら、完了フラグがセットされると、それを再度実行する必要はありません。

個々のファイルではなく、バックアップからディレクトリを除外します。 からXcode:

このプロパティを使用すると、バックアップに不要なキャッシュやその他のアプリケーションサポートファイルを除外できます。ユーザー文書に対して一般的に行われる操作の中には、このプロパティがfalseにリセットされるものがあります。したがって、このプロパティをユーザー文書に使用しないでください。

ここ

が、私は良い結果 で使用している戦略です(申し訳ありませんが、そのは、Objective-Cで - 私は、迅速な男じゃないうまくいけば、それはあなたのアイデアを与えるだろう。):

- (BOOL)moveAllFiles{ 

    // Searches through the documents directory for all files ending in .data 
    BOOL success = true; 
    NSString *myNewLocation = @"/store/my/files/here/now"; 

    // Get the documents directory 
    NSArray *documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentDirectory = [documentDirectories objectAtIndex:0]; 

    // Get all files ending in .data (whatever your file type is) 
    NSArray *dataFilesArray = [NSArray arrayWithArray:[NSBundle pathsForResourcesOfType:@"data" inDirectory:documentDirectory]]; 
    // If you have multiple resource types, use this line once each for each resource type, then append the arrays. 

    // Iterate the found files 
    NSString *fileName = [NSString string]; 
    for (int i=0; i<[dataFilesArray count]; i++) { 
     fileName = [[dataFilesArray objectAtIndex:i] lastPathComponent]; 

     // Move file, set success to false if unsuccessful move 
     if (![[NSFileManager defaultManager] moveItemAtPath:[dataFilesArray objectAtIndex:i] 
                toPath:[myNewLocation stringByAppendingPathComponent:fileName] 
                error:nil]) { 
      success = false; // Something went wrong 
     } 
    } 
    return success; 
} 

成功の値を使用して、ユーザーのデフォルトファイルにキーを設定します。起動時にそのキーを確認します。 false(またはabsent)の場合は、このルーチンを再度実行します。

この例はファイルパスです。あなたが望むなら、ファイルURLで同じことをすることができます。

+0

ありがとう、@ピーター。私が今行った作業は、Documentsディレクトリのフォルダにマークされています。このフォルダには、バックアップ対象ではない問題のダウンロードが保存されています。私はファイルを移動する必要があるかどうか、またはファイルをそのまま残すことができるかどうかについては、決定的な答えを見つけることができません。あなたが引用した文章は「このプロパティをユーザ文書に使用しないでください」と述べていますが、テクニカルQ&Aでは可能です。これに関する追加の文書は見つかりましたか? –

+0

私はそれがうまくいくと思います。私はファイルにdo-not-backupフラグを使用するかどうかに関して、矛盾する公式の例を見つけましたが、上記のパスにはそうしない理由が含まれていました(フラグはユーザーのやり取りによって変更される可能性があります)。ディレクトリに固執する最も慎重なルートになります。 – Peter

関連する問題