2015-07-03 2 views
13

Мы написали мультимедийное приложение, которое позволяет получить список последних видео как список JSon с использованием ФОН FETCHIOS Фоновая передача - com.apple.nsurlsessiond папка полна TMP файлов

затем использует фоновую передачу в скажите 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

ответ

0

Попробуйте что-нибудь подобное перед возвращением из didFinishDownloadingToURL:

// App's 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's Documents directory 
[[NSFileManager defaultManager] moveItemAtPath:location.path toPath:docsPath error:NULL]; 

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

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

0

У меня такая же проблема, но в несколько разных обстоятельствах: на старых устройствах (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's cache directory 
     if (error) *error = [NSError errorWithDomain:NSCocoaErrorDomain 
               code:NSFileNoSuchFileError 
              userInfo:nil]; 

     // OR 
     successOnLegacyPath = YES; 
    } 

    return successOnLegacyPath; 
} 

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

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

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

Смежные вопросы