2014-05-23 26 views
6

Có thực sự không có cách nào để chạy tác vụ UPLOAD trong khi ứng dụng iOS ở chế độ nền không? Chuyện này thật vớ vẩn. Đã tìm kiếm các nội dung khác nhau như NSURLSessionUploadTask, dispatch_after và thậm chí NSTimer, nhưng không có gì hoạt động trong hơn 10 giây ít ỏi của ứng dụng sau khi được đặt ở chế độ nền.iOS: Thực hiện tác vụ tải lên trong khi ứng dụng ở chế độ nền

Các ứng dụng khác có tải lên hoạt động như thế nào? Giả sử, tải hình ảnh lên Facebook và đặt ứng dụng ở chế độ nền, điều đó có hủy quá trình tải lên không?

Tại sao iOS không có dịch vụ nền hoặc đại lý như Android và Windows Phone có?

Đây là tính năng quan trọng của ứng dụng của tôi và trên các nền tảng khác hoạt động hoàn hảo.

Any help is appreciated :(

+0

này có vẻ là có thể sử dụng lập trình phía máy chủ nếu bạn là có thể tạo và gọi một webservice để thực hiện nhiệm vụ cho bạn. Kiểm tra liên kết: http://stackoverflow.com/questions/25725811/upload-image-video-to-facebook-asynchronously-using-php-sdk-4. Không chắc chắn, nếu nó có liên quan đến bạn trong anyway. –

Trả lời

6

Bạn có thể tiếp tục cập nhật trong nền với iOS 7 trở lên nếu bạn sử dụng [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:] cho cấu hình khi bạn nhanh chóng của bạn NSURLSession

Lưu ý:.

  • bạn phải sử dụng ủy quyền dựa trên NSURLSession;

  • bạn không thể u se sử dụng completionHandler các phiên bản của các phương thức của nhà máy nhiệm vụ với các phiên nền; và

  • bạn cũng phải sử dụng phương thức uploadTaskWithRequest:fromFile:, không phải hiển thị NSData.

  • đại biểu ứng dụng của bạn phải triển khai application:handleEventsForBackgroundURLSession:completionHandler: và nắm bắt trình xử lý hoàn thành mà bạn có thể gọi trong phương thức NSURLSessionDelegateURLSessionDidFinishEventsForBackgroundURLSession: của mình.


Bằng cách này, nếu bạn không muốn sử dụng nền NSURLSession, nhưng bạn muốn tiếp tục chạy một nhiệm vụ hữu hạn dài hơn một vài giây sau khi ứng dụng lá nền, bạn có thể yêu cầu thêm thời gian với phương thức UIApplicationbeginBackgroundTaskWithExpirationHandler. Điều đó sẽ cung cấp cho bạn một vài phút để hoàn thành bất kỳ tác vụ nào bạn đang thực hiện. Xem Liệt kê 3-3 trong Thực thi một nhiệm hữu hạn-Length trong phần Background của phần App States and Multitasking của Lập trình Hướng dẫn iOS App:

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

Bạn có chắc chắn về 'completionHandler' không? Tôi không tìm thấy bất kỳ đề cập nào trong tài liệu phương thức 'uploadTaskWithRequest: fromFile: completionHandler:' cho biết rằng nó không thể được sử dụng cho tác vụ tải lên nền. – mrvincenzo

+0

Xem [tài liệu cho 'URLSession'] (https://developer.apple.com/reference/foundation/urlsession) có nội dung" Vì ứng dụng của bạn có thể thoát và được khởi chạy lại trong khi quá trình chuyển đang diễn ra, các khối xử lý hoàn tất không được hỗ trợ. " – Rob

+0

Cảm ơn rất nhiều, Rob! – mrvincenzo

Các vấn đề liên quan