2015-07-03 9 views
13

Wir haben die Medien-Anwendung geschrieben haben, dass Sie eine Liste der neuesten Videos als json Liste erhalten können mit HINTERGRUND FETCHiOS Background Transfer - com.apple.nsurlsessiond Ordner voller tmp-Dateien

dann verwendet es HINTERGRUND TRANSFER Sag iOS, dass es eins nach dem anderen herunterladen und wieder schlafen gehen und die App wecken soll, wenn es fertig ist.

Es tut das alles, aber wir haben festgestellt, dass Speichernutzung wächst und wächst.

Wir fügten Code alle heruntergeladenen Videos zu löschen, sondern Raumnutzung in den Einstellungen hallo geblieben.

Wir heruntergeladen die App-Ordner Xcode> Organizer> Geräte und fand das tmp-Ordner HINTERGRUND TRANSFER war stumpf von tmp-Dateien.

Sollten diese ausgeräumt nicht

werden immer Dies ist im Allgemeinen der Code ich verwende. Ich denke, das wichtigste ist, dass ich mehrere DownloadTask (kann bis zu 30 sein) an eine Hintergrundsitzung anhängen. Dateien variieren in der Größe von Filmen zu PDFs.

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

Antwort

0

so etwas wie dies versuchen, bevor sie aus didFinishDownloadingToURL Rückkehr:

// 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]; 

Die documentation besagt, dass Sie sollten „, um die Datei zu einem dauerhaften Standort der in Ihrer App Sandbox bewegen Container-Verzeichnis vor der Rückkehr von dieser Delegate-Methode " (vielleicht die Dokumente Verzeichnis).

Die temporären Dateien, die gelöscht werden, nachdem Sie von didFinishDownloadingToURL zurückgekehrt sind (oder wenn der Download fehlgeschlagen ist) - nach Ermessen des Betriebssystems (normalerweise unter Speicherdruck).

0

Ich habe das gleiche Problem, aber in ein bisschen anderen Umständen: auf älteren Geräten (iPhone 4S oder älter) wird die App in der Regel während des Hintergrunds vom Betriebssystem abgerufen getötet. Wahrscheinlich um Speicher zu befreien. In diesem Fall werden die tmp-Dateien beibehalten (und nicht verfolgt). Die nächste Mal die App die Möglichkeit hat, zu holen, werden neue Dateien erstellt ... und dieser Zyklus geht weiter und weiter, bis der Benutzer die App erkennt 4 GB Speicherplatz verwendet - und löscht sie.

Ich habe nicht die perfekte Lösung noch nicht gefunden - auch nachdem ich die Hintergrundkonfiguration -NSURLSessionConfiguration Urlcache zu einem benutzerdefinierten eins gesetzt (Dokumentation sagt, es Null standardmäßig ist) mit einem Pfad im selben Verzeichnis (defaultCacheDir/com.apple .nsurssessiond/...) wurde verwendet - aber eine Bereinigungsmethode erstellt und verwendet, wenn ich sicher bin, dass kein Download ausgeführt wird.

+ (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; 
} 

Dies ist keine Lösung und dies wird empfohlen, zu verwenden, wenn kein Download läuft. Habe nicht getestet, was passiert, wenn Downloads ausgeführt werden und versucht wird, die tmp-Dateien zu löschen.

Auch wenn ich eine Lösung finden, die zuvor erstellten tmp-Dateien bleiben nach wie vor untracked so diejenigen, die durch ein Verfahren wie diese gelöscht werden müssen.

Btw, this scheint die gleiche Frage zu sein - ohne Schlussfolgerung.