2014-05-23 18 views
6

Gibt es wirklich keine Möglichkeit, einen UPLOAD-Task auszuführen, während sich eine iOS-App im Hintergrund befindet? Das ist lächerlich. Betrachtet verschiedene Sachen wie NSURLSessionUploadTask, dispatch_after und sogar NSTimer, aber nichts funktioniert für mehr als die mageren 10 Sekunden, die die App lebt, nachdem sie in den Hintergrund gestellt wurde.iOS: Führen Sie den Upload-Vorgang aus, während sich die App im Hintergrund befindet

Wie funktionieren andere Apps, die Uploads haben? Sagen Sie, wenn Sie ein Bild auf Facebook hochladen und die App in den Hintergrund stellen, wird der Upload dann abgebrochen?

Warum kann iOS keine Hintergrunddienste oder Agenten wie Android und Windows Phone haben?

Dies ist ein kritisches Merkmal meiner App, und auf den anderen Plattformen funktioniert perfekt.

Jede Hilfe ist willkommen :(

+0

Dies scheint möglich zu sein, Programmierung mit Server-Seite, wenn Sie in der Lage, einen Webservice zu erstellen und aufzurufen, um eine Aufgabe für Sie zu erledigen. Überprüfen Sie den Link: http://stackoverflow.com/questions/25725811/upload-image-video-to-facebook-asynchron-using-php-sdk-4. Nicht sicher, ob es für Sie relevant ist. –

Antwort

6

Sie Uploads im Hintergrund mit iOS weiterhin 7+, wenn Sie [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:] für die Konfiguration verwenden, wenn Sie Ihre NSURLSession instanziiert

. Hinweis:

  • müssen Sie die Delegierten-basierte NSURLSession;

  • verwenden Sie können nicht u Verwenden Sie completionHandler Darstellungen der Task Factory-Methoden mit Hintergrundsitzungen; und

  • müssen Sie auch uploadTaskWithRequest:fromFile: Methode verwenden, nicht die NSData Wiedergabe.

  • AppDelegate müssen application:handleEventsForBackgroundURLSession:completionHandler: implementieren und erfassen, dass die Fertigstellung Handler, die Sie dann in Ihrem NSURLSessionDelegate Methode URLSessionDidFinishEventsForBackgroundURLSession: aufrufen können.


By the way, wenn Sie nicht in den Hintergrund NSURLSession verwenden wollen, aber Sie wollen für mehr als ein paar Sekunden, um eine endliche Länge Aufgabe weiter ausgeführt werden, nachdem die App Hintergrund verlässt, können Sie fordern Sie mehr Zeit mit UIApplication Methode beginBackgroundTaskWithExpirationHandler an. Das gibt Ihnen ein paar Minuten, um alle Aufgaben abzuschließen, an denen Sie gerade arbeiten. Listing 03.03 in den Siehe Ausführen eine Finite-Length-Task im Hintergrund Abschnitt des App States and Multitasking Abschnitts des iOS App Programming Guide:

UIApplication *application = [UIApplication defaultApplication]; 

bgTask = [application beginBackgroundTaskWithExpirationHandler:^{ 
    // Clean up any unfinished task business by marking where you 
    // stopped or ending the task outright. 
    [application endBackgroundTask:bgTask]; 
    bgTask = UIBackgroundTaskInvalid; 
}]; 

// Start the long-running task and return immediately. 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    // Do the work associated with the task, preferably in chunks. 

    [application endBackgroundTask:bgTask]; 
    bgTask = UIBackgroundTaskInvalid; 
}); 
+0

Sind Sie sicher, den 'completionHandler' zu sehen? Ich fand keine Erwähnung in der 'uploadTaskWithRequest: fromFile: completionHandler:' -Methodendokumentation, die besagt, dass sie nicht für Hintergrund-Upload-Aufgaben verwendet werden kann. – mrvincenzo

+0

Weitere Informationen finden Sie in der [Dokumentation für URLSession] (https://developer.apple.com/reference/foundation/urlsession). Dort heißt es: "Da die App während des Transfers möglicherweise beendet und neu gestartet wird, sind dies keine Abschlussbehandlungsblöcke unterstützt. " – Rob

+0

Vielen Dank, Rob! – mrvincenzo

Verwandte Themen