2012-06-24 21 views
31

Tôi đang phát triển một ứng dụng iPhone sử dụng mạng. IPhone giao tiếp với máy chủ của tôi thông qua yêu cầu HTTP và sẽ hoạt động trên WiFi và 3G.
Tôi hiện đang sử dụng NSURLConnection initWithRequest để gửi yêu cầu async đến máy chủ của tôi và nhận được trả lời (nhưng tôi sẽ sớm chuyển sang làm việc với ASIHTTPRequest thư viện)Cách sử dụng Khả năng hiển thị iOS

tôi hiểu rằng với loại ứng dụng (ứng dụng đòi hỏi phải có kết nối internet) Tôi nên (phải?) sử dụng Khả năng hiển thị.

Sau khi tìm kiếm trên web và nhìn vào mã ví dụ reachability của Apple tôi vẫn không hiểu một số nội dung cơ bản:

mục đích chính của reachability là gì?

Trong ví dụ của apple, họ phát hiện sự cố mạng với máy chủ, WiFi và 3G và hiển thị cho người dùng một thông báo thích hợp.
Đây có phải là mục đích chính của Khả năng hiển thị, để hiển thị cho người dùng một tin nhắn không? Hoặc tôi có cần sử dụng nó cho các tình huống thực tế khác không? Ví dụ: nếu yêu cầu NSURLConnaction không thành công, tôi có cần sử dụng Khả năng hiển thị bằng cách nào đó để gửi lại yêu cầu không?

Việc sử dụng đúng khả năng hiển thị là gì?

Thông thường chỉ sử dụng một ví dụ ví dụ khi khởi chạy ứng dụng và sau đó nghe thay đổi mạng? Hoặc tôi có nên tự kiểm tra trạng thái khả năng truy cập trước mỗi yêu cầu mạng không?
Có đủ để sử dụng reachabilityWithHostName hoặc tôi cũng cần reachabilityForLocalWiFireachabilityForInternetConnection?

Một điều nữa, tôi hiểu táo có thể từ chối ứng dụng sử dụng mạng và không sử dụng Khả năng hiển thị.
"phải" các phương pháp nào tôi nên triển khai?
Sẽ đủ để chỉ thông báo cho người dùng rằng hiện tại không có internet?

Trả lời

43

Reachability là một lớp tiện ích mạng helper, nó được sử dụng để có được thông tin khác nhau về tình trạng kết nối

mục đích chính của reachability là gì?

  • reachability được sử dụng để truy vấn trạng thái mạng
  • và đăng ký người nghe của bạn để có được thông báo khi thay đổi kết nối

Đây có phải là mục đích chính của reachability, để hiển thị cho người sử dụng một thông điệp?

Không dĩ nhiên, việc sử dụng chính của nó là một trong hai để kiểm tra nếu có kết nối internet, hoặc để nhận thông báo nếu thay đổi các kết nối

Ví dụ, nếu yêu cầu NSURLConnaction đã thất bại làm tôi cần phải sử dụng Khả năng hiển thị bằng cách nào đó để gửi lại yêu cầu?

Có bạn có thể sử dụng nó, ví dụ như những gì tôi thường làm trong dự án của tôi là để lưu tất cả các yêu cầu đã được thực hiện cho một máy chủ từ xa, cho phép nói tôi muốn tải 10 file,

Khi bất kỳ tệp nào không tải xuống được do không có kết nối internet, tôi lưu chúng vào một loạt các lần tải xuống không thành công,

Khi khả năng truy cập thông báo cho tôi rằng kết nối internet đã được khôi phục, tôi lặp lại mảng này và bắt đầu lại quá trình tải xuống

Việc sử dụng đúng khả năng hiển thị là gì?

Tùy thuộc vào các mẫu và nhu cầu của bạn.

Thông thường chỉ sử dụng một ví dụ khi khởi chạy ứng dụng và sau đó nghe để thay đổi mạng?

Có nghĩa là những gì tôi làm, trong các dự án của tôi tôi chỉ có 1 thể hiện của một lớp học quản lý download, và lớp này chỉ có trường hợp còn sống của reachability

Hoặc tôi nên kiểm tra bản thân mình các reachability trạng thái trước mỗi mạng yêu cầu?

Bạn có thể làm điều đó mà không cần phải nhiều thể hiện của lớp reachability, những gì tôi thường làm, là để có một phương pháp trong quản lý download của tôi mà nói với tôi bằng reachability nếu có kết nối hay không.

Đủ để sử dụng reachabilityWithHostName hoặc tôi cũng cần reachabilityForLocalWiFi và reachabilityForInternetConnection?

Không chắc chắn về điều này, nhưng những gì tôi thường làm là kiểm tra kết nối trên tất cả các phương tiện, tôi không phân biệt giữa 3g hoặc wifi, tuy nhiên có một số thực hiện thông tin này (wifi hoặc 3g) có thể hữu ích

+0

Cảm ơn bạn đã trả lời, bạn có thể kiểm tra "một điều nữa" mà tôi đã thêm vào câu hỏi – Eyal

+1

Không hoàn toàn không biết điều đó, tôi có hơn 5 ứng dụng trên appstore, tất cả đều sử dụng Khả năng hiển thị, tôi đã sử dụng khả năng hiển thị như tôi mô tả ở trên trong câu trả lời, vì vậy tôi không biết về những gì phải được thực hiện, tôi thường thực hiện những gì tôi cần –

+1

Bạn nói rằng một trong những mục đích chính của reachability là "để đăng ký nghe của bạn để có được thông báo khi kết nối thay đổi", nhưng nó không cung cấp gọi lại mỗi lần (cố gắng chuyển đổi bộ định tuyến và kiểm tra). –

12

Reachability là một dự án mẫu mà Apple đã tạo. Mọi người sử dụng điều này như một API trên khung SystemConfiguration. Như bạn đã thấy có những phương pháp để kiểm tra xem một máy chủ có thể truy cập được hay không.

Cách tôi sử dụng dự án Reachabilty là tôi đã tạo một lớp với phương thức lớp trả về boolean nếu máy chủ tôi yêu cầu dữ liệu có sẵn. Nếu nó là sau đó phương thức trả về YES và nếu nó không phải là, nó trả về NO (rõ ràng).

Bây giờ, trong ứng dụng tôi đang sử dụng các kết nối bạn cần/nên kiểm tra xem có thể bắt đầu kết nối như tài liệu của Apple nêu rõ không. Tôi có một đơn giản if và sau đó hiển thị một thông báo cảnh báo thích hợp rằng yêu cầu không thể hoàn thành vào lúc này.

Không có yêu cầu nào bạn nên tự động thử lại nếu yêu cầu không thể được thực hiện lần đầu tiên. Mục đích chính của việc này là giữ cho ứng dụng của bạn không bị rơi và đồng thời cung cấp cho người dùng một thông báo rằng nó không thể thực hiện được.

Tôi không tự mình sử dụng thông báo, nhưng đó là vì tôi không quan tâm đến việc giám sát việc kết nối có thể được thực hiện hay không. Đây là một cái gì đó mà bạn sẽ phải quyết định bởi nhu cầu ứng dụng của bạn.

Bạn không bắt buộc phải sử dụng tất cả các phương pháp trong lớp Reachablitiy, đủ để sử dụng một trong số chúng. Nó được ghi lại những gì các phương thức khác nhau cung cấp và khi chúng được sử dụng trong tệp tiêu đề.

Hãy nhớ bao gồm khung SystemConfiguration.

+0

Cảm ơn câu trả lời của bạn, khi kiểm tra xem máy chủ có khả dụng trước mọi yêu cầu mạng hay không, điều này sẽ thêm chi phí cho mọi yêu cầu? – Eyal

+0

Có, nhưng điều đó phải là tối thiểu. Tôi đã không nhận thấy bất kỳ chi phí đáng chú ý làm việc đó mặc dù. Đối với những câu hỏi bạn đã thêm, tôi đã trả lời nó rồi. Hãy cho tôi biết nếu có gì đó vẫn chưa rõ ràng :) – Andreas

+0

Vì vậy, hãy cho tôi biết nếu tôi hiểu đúng, để có được kết quả tương tự nhưng với thông báo, tôi sẽ giữ một số boolean toàn cầu "HostIsAvailable", boolean này sẽ được cập nhật khi tôi nhận được Thông báo khả năng hiển thị, sau đó trước mọi yêu cầu mạng, tôi sẽ kiểm tra xem CÓ CÓ, nếu không tôi sẽ hiển thị cho người dùng một thông báo cảnh báo. – Eyal

0

Khả năng hiển thị giúp bạn đoán được liệu internet có thể truy cập được hay không. Nó cho bạn biết liệu bạn có quyền truy cập thông qua WiFi hay không hoặc liệu bạn có quyền truy cập chỉ thông qua Dữ liệu di động hay không. Không có đảm bảo rằng nó là chính xác. Nếu nó nói rằng bạn có kết nối WiFi, kết nối đó có thể bị mất một giây sau đó. Cách duy nhất để tìm xem liệu việc truy cập một URL có hoạt động hay không là thực hiện truy cập đó và xem điều gì xảy ra. Có những tình huống mà quyền truy cập sẽ hoạt động khi Khả năng hiển thị nói rằng điều đó không xảy ra và ngược lại. Dưới đây là những gì tôi sử dụng Khả năng hiển thị cho: Sau khi tải xuống không thành công do không có kết nối internet, tôi sẽ bắt đầu thử lại khi Reachability phát hiện thay đổi (thực ra sau vài giây; Truy cập URL thường không thành công ngay sau khi Reachability nói WiFi trở lại) . Sau khi tải xuống không thành công khi Dữ liệu di động không được phép, hãy kiểm tra xem liệu Dữ liệu di động có khả dụng hay không sau đó yêu cầu người dùng cho phép sử dụng Dữ liệu di động.