2011-05-19 7 views
10

Sửa 23.5.11Đang cập nhật iPhone reachability trên mạng thay đổi

bây giờ tôi đang tự hỏi liệu tôi qua kỹ thuật này. Khi tôi sử dụng một kết nối trực tuyến, tôi xử lý nó đúng - hoặc:

  • sau nền hệ thống chỉ báo tiến trình hoặc hoạt động hiển thị và nếu nó không thành công, tôi hiển thị thông điệp phù hợp HOẶC

  • tôi gọi khác ứng dụng, hoặc Safari hoặc Maps mà sau đó sẽ thực hiện kiểm tra riêng của nó và thất bại nếu không có kết nối. Điều đó khiến người dùng trong ứng dụng khác đã thất bại, đó không phải là tho hoàn hảo.

Vì vậy, nếu tôi làm những gì tôi đang đề xuất dưới đây và chuẩn reachability trả không thể truy cập và sau đó tôi phải làm một NSURLConnection trong trường hợp radio đã đi vào giấc ngủ, sau đó tôi không chắc chắn rằng bất kỳ tốt hơn chỉ cố gắng để có được nguồn tài nguyên trực tuyến ngay từ đầu.

Nếu có ai có thể giúp - Tôi thực sự biết ơn. Tôi gần như đã sẵn sàng để gửi, chỉ cần để có được quyền này.

Tôi đang sử dụng mẫu Khả năng hiển thị của Apple để có hiệu quả tốt ngoại trừ khi kết nối di động hoặc di động chuyển sang chế độ ngủ và sau đó quay lại hoặc kết nối di động.

Phạt tiền khi kết nối di động (di động) không thay đổi. Điều này phù hợp với các bình luận tôi đã đọc, khi radio di động tắt, bạn phải đánh thức nó một cách thủ công. Tuy nhiên, tôi không thể thấy làm thế nào để làm điều đó.

Tôi có cần thiết lập NSURLConnection không? Một số mã mẫu sẽ là tuyệt vời. Khi tôi nhận được thông báo rằng không có kết nối, tôi có gửi NSURLConnection và yêu cầu người dùng thử lại sau giây lát không và sau đó nếu tôi nhận được cuộc gọi lại để nói thành công, hãy ghi đè cài đặt tắt từ Khả năng hiển thị?

Ngoài ra, tôi có cần phải làm điều đó bất cứ khi nào có vẻ như không có kết nối, chỉ trong trường hợp của nó - điều này dường như lãng phí tài nguyên khi nó có thể không được như vậy. ví dụ: iPod Touch không có trong phạm vi kết nối wifi.

Tôi cũng đã xem xét thay thế của DDG, nhưng có vẻ như điều đó sẽ có cùng một vấn đề.

Bất kỳ đề xuất hữu ích nào cũng sẽ được chào đón nồng nhiệt.

Xin cảm ơn,

Chris.

Trả lời

13

Bạn không thể và không nên sử dụng mã mẫu Reachabilty của Apple (hoặc SCNetworkReachabilityFlags) để xác định xem tài nguyên mạng có khả dụng hay không. Chúng cung cấp cho bạn các công cụ hữu ích để cung cấp phản hồi của người dùng về lý do kết nối không thành công và để xác định xem có nên thử lại kết nối hay không và khi nào. Tuy nhiên nếu bạn muốn truy cập tài nguyên mạng, bạn chỉ nên yêu cầu.

Không hiển thị cho người dùng của bạn cảnh báo "không có kết nối mạng" dựa trên cờ khả năng kết nối. Thực hiện yêu cầu mạng của bạn và nếu nó không kiểm tra cờ khả năng kết nối và lịch sử yêu cầu của bạn để xem liệu bạn có nên cho người dùng biết rằng yêu cầu không thành công hoặc âm thầm thử lại. Bạn không nên muốn hoặc cần spam người dùng với mọi lỗi mạng.Nếu một yêu cầu thất bại, hãy xem xét thử lại nếu máy chủ có thể truy cập được và chỉ báo cáo sự thất bại cho người dùng sau một vài lần thử hoặc khi cờ khả năng tiếp cận cho thấy rằng bạn đã thực sự mất kết nối mạng và không chỉ yêu cầu duy nhất thất bại.

Để kích hoạt lại radio của thiết bị, bạn cần cân bằng mong muốn tìm nạp tài nguyên mạng bằng cách cho phép thiết bị tắt nguồn các giao diện mạng để tiết kiệm điện. Tôi không biết ứng dụng của bạn đang cố gắng làm gì nhưng tôi khuyên bạn nên cho phép thiết bị tắt nguồn và sau đó cố kết nối để phản hồi người dùng yêu cầu ứng dụng tìm nạp dữ liệu mới. Tôi không thấy trường hợp bạn muốn kích hoạt lại một đài phát thanh chỉ để cung cấp cho người dùng một gợi ý rằng một số tài nguyên mạng có thể hoặc hiện tại không thể truy cập được.

Xem https://devforums.apple.com/message/409618

Cách duy nhất để biết liệu một máy chủ có sẵn là cố gắng để kết nối với nó. Nếu kết nối đó không thành công, bạn có thể sử dụng khả năng hiển thị để cung cấp phản hồi cho người dùng và hướng dẫn cơ chế thử lại của bạn, nhưng việc sử dụng khả năng hiển thị để kết nối trước không phải là một ý tưởng hay.

Vấn đề chính ở đây là khả năng truy cập sử dụng thông tin địa phương để xác định kết quả của nó. Điều này không nói gì về trạng thái của Internet rộng hơn. Máy chủ gốc có thể bị hỏng hoặc bất kỳ số liên kết nào giữa bạn và máy chủ gốc có thể bị hỏng và khả năng hiển thị sẽ vui vẻ nói rằng nó có thể truy cập được. Tại thời điểm đó bạn sẽ cố gắng kết nối, và kết nối sẽ thất bại. Vì vậy, bạn sẽ phải xử lý các lỗi anyway, có nghĩa là bạn cũng có thể không làm preflight và cho phép xử lý lỗi tiêu chuẩn của bạn bao gồm trường hợp này là tốt.

Ngoài ra hãy xem câu hỏi này liên quan đến việc kiểm tra cho một nguồn tài nguyên trước khi tải nó sử dụng một ứng dụng bên ngoài: https://devforums.apple.com/message/411329

Làm một yêu cầu HEAD cho tài nguyên nên cung cấp cho bạn một ý tưởng hợp lý nếu ứng dụng bên ngoài sẽ được có thể tải nó mà không yêu cầu bạn tải xuống một lượng đáng kể dữ liệu (độ trễ vẫn sẽ là mối quan tâm).

+1

Wow Jonah - phản hồi rõ ràng và chi tiết. Bạn có dạy ở đâu không? –

+0

Tuy nhiên, bạn có thể sử dụng mã Khả năng hiển thị để được thông báo khi "trạng thái khả năng hiển thị" thay đổi. –

+0

Cảm ơn @Jonah - đây là một phản ứng tuyệt vời, dứt khoát. Tôi nghĩ rằng sự rõ ràng của bạn sẽ giúp rất nhiều người, như có thể được nhìn thấy bởi các phiếu bầu chúng tôi đã có ngay cả trước khi bạn trả lời. Tôi sẽ đơn giản hóa quá trình của tôi một cách đáng kể. Cảm ơn một lần nữa. – Chris