2013-10-04 18 views
18

Sau khi đọc tài liệu của Apple về tải xuống nền với api iOS7 mới (NSURLSession), tôi hơi thất vọng một chút. Tôi chắc chắn rằng Apple đã được quản lý pause/resume qua mạng có sẵn ở chế độ nền (hoặc cung cấp một tùy chọn để làm như vậy) nhưng không có ...Tải xuống nền NSURLSession - tiếp tục qua lỗi mạng

Vì vậy, đọc tài liệu, đây là những gì chúng tôi đã có:

https://developer.apple.com/library/ios/documentation/cocoa/Conceptual/URLLoadingSystem/NSURLSessionConcepts/NSURLSessionConcepts.html

When any task completes, the NSURLSession object calls the delegate’s URLSession:task:didCompleteWithError: method with either an error object, or nil if the task completed successfully. If the task is a resumable download task, the NSError object’s userInfo dictionary contains a value for the NSURLSessionDownloadTaskResumeData key. Your app should use reachability APIs to determine when to retry, and should then call downloadTaskWithResumeData: or downloadTaskWithResumeData:completionHandler: to create a new download task to continue that download. Go to step 3 (creating and resuming task objects).

cho đến nay tôi hiểu được những giải pháp, nhưng câu hỏi của tôi là: Kiến trúc gì là tốt nhất để xử lý việc mất mạng và tiếp tục tải trong nền? Về phía tôi, tôi đang sử dụng khả năng truy cập và mỗi khi mạng khả dụng, tôi tiếp tục tất cả các tác vụ (được tham chiếu qua NSArray khi tạo) và tạm ngưng chúng khi mạng bị mất. Này hoạt động tốt trong foreground nhưng đối với nền Tôi cần giúp đỡ về những điểm sau đây:

  • Nếu ứng dụng của tôi không có khả năng kết nối trong foreground, nếu tôi đi đến nền mà không kết nối tất cả các nhiệm vụ của tôi vẫn còn lơ lửng và sẽ không đã quay lại nếu mạng khả dụng…

  • Mất mạng trong nền, dừng tất cả nội dung tải xuống/công việc của tôi. Kịch bản:

    • Trong foreground, tôi bắt đầu tải về các nhiệm vụ của tôi
    • tôi đi đến nền và sau 10s chuyển sang "chế độ aireplan"
    • Tất cả công việc của tôi có một lỗi. Vì vậy, trong phương thức URLSession: task: didCompleteWithError: Tôi tiếp tục chúng bằng cách sử dụng downloadTaskWithResumeData hoặc nếu tôi không thể (vì một số không có đủ dữ liệu tiếp tục) Tôi đang tạo một nhiệm vụ mới mà không cần tiếp tục lại (trừ khi mạng đã trở lại) tại thời điểm đó).
    • Sau đó, tôi đặt wifi lên
    • Như tôi vẫn ở chế độ nền Tôi không thể kích hoạt một "sơ yếu lý lịch" khi mạng đã trở lại mà không cần tung ra ứng dụng ...

Làm thế nào để giải quyết những điểm ? Tôi đã bỏ lỡ một cái gì đó?

+0

Tôi chia sẻ sự thất vọng của bạn. Bạn đề cập rằng bạn đang chờ đợi một câu trả lời từ Apple về điều này. Bạn đã nghe từ họ chưa? Độ phân giải là gì? – gavdotnet

+0

Có rất nhiều trao đổi với Apple nhưng đã không hiệu quả, recommandation là sử dụng cờ tùy ý mà nên chăm sóc các trường hợp đề tài (nhưng không có garantie của kết quả trong thời gian). Chế độ này không phải là mục tiêu của tôi, tôi đã không tập trung nhiều vào điều này, nhưng thử nghiệm của tôi đã không thành công. Nếu bạn đã thử nghiệm về phần này mà vẫn còn thú vị để có được thông tin. – Gros

Trả lời

3

Như tôi vẫn ở chế độ nền Tôi không thể kích hoạt một "sơ yếu lý lịch" khi mạng đã trở lại mà không cần tung ra ứng dụng ...


bạn có thể sử dụng "nền lấy", khi ứng dụng được đưa ra bởi lấy, sau đó bạn có thể kiểm tra mạng và tiếp tục nhiệm vụ tải xuống.

+0

Đây có thể là một cách giải quyết khác ... Đang chờ câu trả lời từ Apple ngay bây giờ. – Gros

+0

@Gros bạn có nhận được câu trả lời từ Apple về điều này không? Tôi đang gặp vấn đề tương tự. – Keith

+0

Bất kỳ từ nào về điều này? – Siriss

2

Bạn nên tạo NSURLSession với các cấu hình nền, sau đó nhiệm vụ của bạn được gửi đến một nền ma quỷ và ứng dụng của bạn được gọi khi nó được hoàn thành.

2

thực hiện:

application:handleEventsForBackgroundURLSession:completionHandler: 

trong các đại biểu ứng dụng - mà không cần gọi completionHandler - làm cho ứng dụng để treo xung quanh trong nền sau khi thiết bị mất kết nối của nó trong khi bị đình chỉ.Bằng cách đó, ứng dụng vẫn có thể nghe thông báo khả năng hiển thị và khởi động lại quá trình tải xuống khi kết nối mạng trở nên khả dụng một lần nữa. Tuy nhiên, đây là một cách tiếp cận khá dodgy và có thể không vượt qua hướng dẫn gửi kho ứng dụng của Apple. Ngoài ra, cách tiếp cận này không giúp ích gì nhiều khi kết nối bị mất trong khi ứng dụng ở nền trước và kết nối đã lấy lại trong khi ứng dụng bị tạm ngưng.

Cuối cùng tôi đã làm như sau:

  • Made sử dụng các thông báo application:handleEventsForBackgroundURLSession:completionHandler: tạm dừng tải của tôi ở chế độ nền.
  • Sử dụng thông báo tìm nạp nền không liên tục (ví dụ: application:performFetchWithCompletionHandler:completionHandler) để kiểm tra trạng thái kết nối và khởi động lại mọi tải xuống bị tạm dừng. (hat-tip @gugupluto)

Điều này vẫn không cung cấp hiệu suất tải xuống tối ưu và có thể khiến người dùng tự hỏi tại sao "tải xuống nền" của họ chưa hoàn tất khi họ mở lại ứng dụng, nhưng có vẻ như tốt nhất chúng ta có thể hy vọng từ Apple cho bây giờ.

+0

Theo như tôi có thể nói ứng dụng được đưa ra một khoảng thời gian nhất định (khoảng 30 giây) để gọi trình xử lý hoàn thành được thông qua và nếu nó không thực hiện thì nó sẽ bị một cơ quan giám sát giết, * trừ * khi gỡ lỗi tức là đưa ra thông qua Xcode, mà có thể làm cho một số nhà phát triển nghĩ rằng bỏ qua xử lý hoàn thành là một giải pháp hợp lệ khi nó không. –

+0

@oscahie Điều đó có ý nghĩa nhưng đây không phải là những gì tôi đã chứng kiến ​​khi tôi thử nghiệm nó trên thế hệ thứ 4 của iPad. Ứng dụng dường như vẫn ở chế độ nền vô thời hạn và trả lời các thông báo khả năng hiển thị mạng. – gavdotnet

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