2015-10-20 13 views
6

Khi tôi thiết lập NSURLSession/Alamofire.Manager với cấu hình phiên nền, nếu không có kết nối internet, tôi đang mong nhận được thông thường NSError "Miền lỗi = NSURLErrorDomain Code = -1009" Kết nối Internet có vẻ như đang ngoại tuyến. ".NSURLPhiên bản với cấu hình phiên nền không trả về lỗi khi không có kết nối

Điều này xảy ra thường xuyên nếu tôi không sử dụng cấu hình nền, nhưng nếu tôi định cấu hình như vậy, phương thức gọi lại/đại biểu của tôi không bao giờ được gọi. Cuối cùng nó sẽ được gọi khi tôi kích hoạt lại wifi.

Tôi muốn nhận ive một lỗi ngay lập tức. Tui bỏ lỡ điều gì vậy?

Trả lời

3

Lý do mà tại sao sự thất bại mạng trong nhiệm vụ phiên nền không trả lại bất kỳ lỗi là:

Nói chung một phiên nền NSURLSession không thất bại một nhiệm vụ nếu họ gặp khó khăn trên dây. Thay vào đó, nó tiếp tục tìm kiếm một thời gian tốt để chạy yêu cầu và thử lại tại thời điểm đó . Điều này tiếp tục cho đến khi hết thời gian tài nguyên (có nghĩa là, giá trị trong thuộc tính timeoutIntervalForResource trong đối tượng NSURLSessionConfiguration bạn sử dụng để tạo phiên). Giá trị mặc định hiện tại cho giá trị là một tuần!

Tôi tìm thấy câu trả lời ở trên tại developer forum.

Thêm các chi tiết mà có thể giúp đỡ trong phiên nền:

Một lợi ích khác là trong một phiên nền, chúng tôi giám sát mạng và môi trường năng lượng cho bạn. Điều này có nghĩa là chúng tôi bao gồm mọi thứ như khả năng kết nối và khả năng kết nối mạng cho bạn, do đó bạn không có để sử dụng các API khả năng truy cập. Chúng tôi sẽ không cố gắng thiết lập kết nối cho đến khi chúng tôi biết rằng máy chủ có thể truy cập được. Và tương tự, nếu người dùng đang thực hiện tải xuống và thoát ra khỏi Wi-Fi, thông thường nhiệm vụ đó sau đó sẽ không thành công với lỗi truyền. Nhưng, trong một phiên nền , chúng tôi sẽ thực sự khôi phục từ phiên đó một cách tự động và thử lại và tiếp tục lại ở nơi chúng tôi đã dừng lại nếu quá trình tải xuống có thể tiếp tục. Và bạn sẽ không nghe về lỗi đó.

Nguồn: WWDC 2014

2

API không cho bạn biết rằng mạng không có mặt, vì đó sẽ là lỗi, cho biết kết nối sẽ không bao giờ kết thúc. Trong thực tế, nó sẽ, giả sử mạng cuối cùng trở lại.

Nếu bạn cần nhận được lỗi vì một số lý do, không sử dụng phiên nền.

Hoặc, nếu bạn chỉ muốn biết liệu mạng có lên hay không đối với một số loại gợi ý giao diện người dùng, hãy sử dụng API khả năng truy cập. Với điều đó đã nói, đừng từ chối bắt đầu yêu cầu dựa trên khả năng hiển thị không thành công, bởi vì khả năng tiếp cận nằm.

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