13

Background FETCH を使用して、最新の動画のリストを json リストとして取得できるメディア アプリケーションを作成しました。

次に、バックグラウンド トランスファーを使用して、iOS にビデオを 1 つずつダウンロードし、スリープ状態に戻り、完了したらアプリを起動するように指示します。

それはすべてそれを行いますが、スペースの使用量がどんどん増えていることに気付きました.

ダウンロードしたすべての動画を消去するコードを追加しましたが、設定で容量の使用率が高いままでした。

[Xcode] > [Organizer] > [Devices] を使用してアプリ フォルダーをダウンロードしたところ、Background TRANSFER tmp フォルダーに tmp ファイルが含まれていないことがわかりました。

これらは一掃されるべきではありませんか

これは一般的に私が使用するコードです。主なことは、1 つのバックグラウンド セッションに複数の DownloadTask (最大 30 まで) をアタッチすることだと思います。ファイルのサイズは、動画から PDF までさまざまです。

NSURLSession * backgroundSession_ = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:identifier];


backgroundSession_ = [NSURLSession sessionWithConfiguration:urlSessionConfigurationBACKGROUND_
                                                   delegate:self
                                              delegateQueue:[NSOperationQueue mainQueue]];

NSOperationQueue *mainQueue_ = [NSOperationQueue mainQueue];



NSURLSessionDownloadTask * downloadTask_ = [backgroundSession_ downloadTaskWithURL:url_];

downloadStarted_ = TRUE;
[downloadTask_ resume];

ここに画像の説明を入力

4

2 に答える 2

0

同じ問題がありますが、状況が少し異なります。古いデバイス (iPhone 4S 以前) では、通常、OS によるバックグラウンド フェッチ中にアプリが強制終了されます。おそらくメモリを解放するためです。この場合、tmp ファイルは保持されます (追跡されません)。次にアプリがフェッチする機会があれば、新しいファイルが作成されます...そして、ユーザーがアプリが4GBのストレージスペースを使用していることを認識して削除するまで、このサイクルが続きます。

バックグラウンド構成の-NSURLSessionConfiguration URLCacheを同じディレクトリ (defaultCacheDir/com.apple.nsurlsessiond/... ) が使用されましたが、クリーンアップ方法を作成し、進行中のダウンロードがないことがわかっている場合に使用します。

+ (BOOL)clearCache:(NSError * __autoreleasing *)error
{
    __block BOOL successOnLegacyPath = NO;
    __block NSError *errorOnLegacyPath = nil;

    NSString *cacheDirPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];

    NSArray *allSubPaths = [[NSFileManager defaultManager] subpathsAtPath:cacheDirPath];

    if (!allSubPaths) {
        NSLog(@"No subpaths of cache:\n%@", cacheDirPath);
    } else {
        [allSubPaths enumerateObjectsUsingBlock:^(NSString *subpath, NSUInteger idx, BOOL *stop) {
static NSString * const kNSURLSessionPathComponent = @"nsurlsession";  // this is a non-documented way, Uncle Apple can change the path at any time
            if ([subpath containsString:kNSURLSessionPathComponent]) {
                successOnLegacyPath = [[NSFileManager defaultManager] removeItemAtPath:[cacheDirPath stringByAppendingPathComponent:subpath]
                                                                                 error:&errorOnLegacyPath];
                if (!successOnLegacyPath) {
                    NSLog(@"Error while deleting cache subpath:\n%@\nError:\n%@", subpath, errorOnLegacyPath);
                }
                // First we find is the root > bail out
                *stop = YES;
            }
        }];
    }

    if (!successOnLegacyPath && !errorOnLegacyPath) {
        // Couldn't find the nsurlsession's cache directory
        if (error) *error = [NSError errorWithDomain:NSCocoaErrorDomain
                                                code:NSFileNoSuchFileError
                                            userInfo:nil];

        // OR
        successOnLegacyPath = YES;
    }

    return successOnLegacyPath;
}

これは解決策ではなく、ダウンロードが進行中でない場合に使用することをお勧めします。実行中のダウンロードがあり、tmp ファイルを削除しようとした場合に何が起こるかはテストしていません。

解決策を見つけたとしても、以前に作成した tmp ファイルは追跡されないままなので、このような方法で削除する必要があります。

ところで、これは同じ質問のようです-結論はありません。

于 2015-07-30T14:55:05.777 に答える