Подтвердить что ты не робот

IOS Background Transfer - папка com.apple.nsurlsessiond, полная файлов tmp

Мы написали мультимедийное приложение, которое позволяет вам получить список последних видеороликов как список json, используя BACKGROUND FETCH

то он использует BACKGROUND TRANSFER, чтобы сказать iOS, чтобы загрузить видео по одному и вернуться спать и разбудить приложение, когда оно закончится.

Он делает все это, но мы заметили, что использование пространства растет и растет.

Мы добавили код, чтобы очистить все загруженные видео, но использование пространства оставалось в настройках.

Мы загрузили папки приложений с помощью Xcode > Organizer > Devices и обнаружили, что папка TMP в BACKGROUND TRANSFER была скучной из файлов tmp.

Не следует ли очищаться

Это, в общем, код, который я использую. Я считаю, что основным является подключение нескольких 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];

enter image description here

4b9b3361

Ответ 1

Попробуйте что-то вроде этого, прежде чем вернуться с didFinishDownloadingToURL:

// App Documents directory path
NSString *docsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject];

// Creating the path for the downloaded file
docsPath = [docsPath stringByAppendingPathComponent:downloadTask.response.suggestedFilename];

// Moving the file from temp location to App Documents directory
[[NSFileManager defaultManager] moveItemAtPath:location.path toPath:docsPath error:NULL];

documentation заявляет, что вы должны " перенести файл в постоянное место в каталоге контейнеров для песочниц приложений, прежде чем вернуться с этот метод делегата (возможно, Документ).

Временные файлы, которые очищаются после возврата из didFinishDownloadingToURL (или если загрузка не удалась) - по усмотрению ОС (обычно под давлением памяти).

Ответ 2

У меня такая же проблема, но в несколько разных обстоятельствах: на старых устройствах (iPhone 4S или старше) приложение обычно убивается во время фоновой загрузки ОС. Возможно, чтобы освободить память. В этом случае файлы tmp сохраняются (и не отслеживаются). В следующий раз, когда приложение получит возможность получить, создаются новые файлы... и этот цикл продолжается и продолжается до тех пор, пока пользователь не узнает, что приложение использует 4 ГБ пространства для хранения - и удаляет его.

Я еще не нашел идеального решения - даже после того, как я установил конфигурацию фона -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 cache directory
        if (error) *error = [NSError errorWithDomain:NSCocoaErrorDomain
                                                code:NSFileNoSuchFileError
                                            userInfo:nil];

        // OR
        successOnLegacyPath = YES;
    }

    return successOnLegacyPath;
}

Это не решение, и это рекомендуется использовать, если загрузка не выполняется. Не тестировали, что происходит, если выполняются загрузки и удаляются файлы tmp.

Даже если я найду решение, ранее созданные tmp файлы по-прежнему остаются без следа, поэтому их нужно удалить с помощью такого метода.

Btw, this, похоже, тот же вопрос - без заключения.