2015-03-04 6 views
7

Ich habe ein seltsames Problem mit NSURLSession auf der Delegate-Methode didFinishDownloadingToURL.NSURLSession didFinishDownloadingToURL temporäre heruntergeladene Datei nicht gefunden

Der erste, was ich tue, ist zu überprüfen, ob die temporäre heruntergeladene Datei vorhanden:

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask 
              didFinishDownloadingToURL:(NSURL *)location 
{ 
    if (![[NSFileManager defaultManager] fileExistsAtPath: [location path]]) 
    { 
     NSLog(@"Error. File not found"); 
     return; // is giving error when the app is wake up by the system 
    } 
    ... 
} 

Es funktioniert in der Regel, wenn der App im Vordergrund und Download beendet ist. Wenn sich die App jedoch im Hintergrund befindet und vom Betriebssystem zwangsweise getötet wird, wird false zurückgegeben.

Hat jemand eine Idee, was passieren könnte? Ich weiß, dass es ein Zeitlimit für die Ausführung dieser Delegate-Methode gibt, wenn die App vom Betriebssystem aktiviert wird, da es keinen Sinn macht, dass die temporäre Datei nicht da ist. Ich kann es nicht einmal an einen anderen Ort kopieren ... Macht es wegen der Größe der Datei Sinn? Ich lade eine Datei von + -130MB herunter.

Danke.

+0

Ich habe das gleiche Problem. Filed einen Fehlerbericht http://openradar.appspot.com/radar?id=4943165404479488 – Biga

+0

Versuchen Sie, die URL trotzdem zu öffnen. Der Aufruf von fileExistsAtPath könnte Ihnen aufgrund von Eigenheiten in Zusammenhang mit der App-Sandbox anzulasten sein. – dgatwood

+0

haben ähnliches Problem. Der Speicherort verweist auf eine Datei, die nicht existiert. Es passiert nicht oft. Ein bisschen nervig. Ich frage mich, ob dieser Fehler eine schlechte Akkulaufzeit verursacht, weil diese Datei erneut heruntergeladen wird. Und wenn der Standort wieder falsch ist, dann erneut heruntergeladen ... etc. –

Antwort

1

Ich löste das gleiche Problem durch die Installation der App nach der Deinstallation der App. Es scheint, dass die NSURLSession Trümmer im System zurücklässt, wenn während einer Netzwerksitzung eine Zwangsabschaltung auftritt.

+0

Ich bin ein Unit Tests Ziel auf einem Framework-Projekt (nicht app) auf dem Simulator ausgeführt, so nicht sicher, wie Sie Ihre Lösung versuchen. Ich bin ** ungültig ** die Sitzung in beiden "setUp()" und "tearDown()" ... –

+0

Ich bekomme das als Speicherort /var/mobile/Library/Caches/com.apple.nsurssessiond/Downloads /com.xxxxxxx/CFNetwo rkDownload_uFBpqp.tm p Ich sehe dasselbe Verhalten unter ios 10.3.2. Die einzige Möglichkeit, dies zu beheben, ist das Gerät neu zu starten. –

-2

Vom Apple Docs:

(location ist ..) „Eine Datei-URL für die temporäre Datei Da die Datei vorübergehend ist, müssen Sie entweder die Datei zum Lesen öffnen oder auf einen festen Standort bewegen in Ihrem. apps Sandbox-Container-Verzeichnis vor der Rückkehr von dieser Delegate-Methode.

Wenn Sie die Datei zum Lesen öffnen, sollten Sie die tatsächliche Lesung in einem anderen Thread tun, um die Delegiertenwarteschlange nicht zu blockieren. "

+1

In dem Beispiel wird auf die Datei zugegriffen "vor der Rückkehr von dieser Delegate-Methode" - das Problem ist, dass es nicht da ist. Die Apple-Dokumente sind unter normalen Umständen korrekt, aber nicht in dem oben beschriebenen Fall. – Joseph