2015-07-03 55 views
13

我們已經寫了一個媒體應用程序,允許您使用背景FETCHiOS的後臺傳輸 - com.apple.nsurlsessiond文件夾的完全的tmp文件,

獲得的作爲JSON列表最新的視頻列表,然後它使用後臺傳輸到讓iOS逐一下載視頻,然後回去睡覺,並在完成後喚醒應用程序。

它完成了所有這一切,但我們注意到空間使用量正在增長和增長。

我們添加了代碼來清除所有下載的視頻,但空間使用率在設置中保持不變。

我們使用Xcode> Organizer> Devices下載了應用程序文件夾,發現BACKGROUND TRANSFER tmp文件夾是tmp文件的沉悶。

不應該被清除掉

這通常是我使用的代碼。 我認爲主要是我附加多個DownloadTask(可以達到30)到一個後臺會話。檔案大小從電影到pdf。

​​

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狀態,你應該「的文件移動到永久位置在應用程序的沙箱容器目錄從這個委託方法返回之前「(也許Documents目錄)。

臨時文件在從didFinishDownloadingToURL(或下載失敗)返回後被清除掉 - 由操作系統決定(通常在內存壓力下)。

0

我有同樣的問題,但在一些不同的情況下: 在較舊的設備(iPhone 4S或更舊版本)上,應用程序通常在操作系統獲取後臺進程期間被終止。可能會釋放記憶。在這種情況下,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文件仍然未被跟蹤,所以需要使用這種方法刪除這些文件。

Btw,this似乎是同一個問題 - 沒有結論。