簡體   English   中英

使用Reachability有什么好處?

[英]What is the advantage of using Reachability?

使用Reachability比下面的代碼有什么好處? 我覺得Reachability有很多代碼,但如果它以任何方式更好,那么我會用它代替。

NSString *connectionString = [[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];

if ([connectionString length] == 0) {

    //No connection

}

現在被授予,如果谷歌曾經失敗,那么這將不起作用。 但實際上沒有機會發生這種情況。 你怎么看? 謝謝!

這實際上是一個非常好的問題 - 我在公司招聘時在iOS開發人員訪談中實際使用它是如此之好:

為什么Apple的可達性示例數百行,當您只需使用一行來檢查URL是否響應時?

首先,網絡可達性實際上非常非常復雜 它不僅僅是測試URL。 想想以下示例:

  • 用戶使用3G,但已用完了數據限額,因此每個請求都會重定向到運營商的網站。

  • 用戶連接到需要身份驗證/登錄的公共WiFi網絡,因此請求會重定向到登錄頁面

最后一個例子非常普遍 - 它一直在發生。 但是如果您使用initWithContentsOfURL您的應用程序會想象您有連接,而實際上您沒有:您只需返回網絡重定向到的頁面內容。

這就是為什么Apple的代碼比你最初想象的要復雜得多的原因之一。 您不應該只是問“我可以訪問此URL” ,而是“從此URL返回的數據是我期望的 ”。

但這真的只是冰山一角。 除此之外,可達性還有很多 - 例如,我可能有一個需要下載大量信息的應用程序,比如50MB。 如果用戶在未經他們同意的情況下使用3G連接,那么簡單地下載50MB數據將是一個壞主意 - 特別是如果他們正在漫游,或者是在受限制的數據計划上。 因此,Reachability還會告訴您用戶所處的連接類型 :EDGE,3G,WiFi等(*注意:請參閱下面的注釋,這可能不是最好的建議)。

Reachability中的ReadMe.txt將告訴您更多關於代碼可以做什么和不可以做什么的內容。

遺憾的是,網上有太多人沒有意識到有很多日常場景,其中initWithContentsOfURL將返回有效的響應,但用戶將無法連接。 [博客這樣的帖子] [1]在Google中被編入索引,人們認為它是可接受的替代品:它不是!

我在招聘時提出這個問題的原因之一是,它可以顯示開發人員不只是在盒子里思考 - 就像你和許多其他開發人員一樣,當我看到Reachability示例代碼時我的第一反應是“哇,這看起來太復雜了對於非常簡單的事情“。 但希望這個答案會在某種程度上說服你。


編輯:絕對注意下面史蒂文的評論。 他提出了我的答案未考慮的一些要點(即MiFi熱點),並提出了一個有效的案例,即Reachability不一定是編碼天堂代碼的頂峰。 在許多情況下,開發人員將使用自己的改進等修改可達性。

可達性的最大問題不在於它是錯誤的代碼,還是使用不好的代碼。 它現在實際上是相當不錯的代碼。 但是,為了一個無意的目的,誤解和誤用是很容易的代碼。

以下是使用可達性的一些指導原則:

  • 是的,使用Reachability。 也許最明顯的一點是:可達性可以成為讓您的應用感覺更自然的巨大資產。
  • 切勿將可達性用作預檢檢查。 僅僅因為Reachability報告網絡當前不可用並不意味着如果您嘗試使用它將無法使用它 您沒有發送的網絡請求可能會喚醒iOS的網絡。
    • 編輯:實際上,我可能應該稍微軟化一下。 在短時間內推遲未經請求的操作可能是有意義的。 在其他條件相同的情況下,最好連續進行所有聯網,而不是反復打開和關閉硬件。 如果可能的話就要破裂! 但是你永遠不應該阻止用戶根據Reachability做某事。
  • 使用可達性來幫助診斷出現故障的原因。 嘗試建立網絡后,Reachability會告訴您網絡不可用。 這是可用於構造良好錯誤消息的有用信息,可能比API返回的確切錯誤代碼更重要。
  • 允許用戶手動重試。 用戶可能知道網絡應該在這個位置工作。 不要依賴iOS注意到現在可以使用網絡,並且可通過Reachability通知您。 同樣,嘗試可能是讓它可用的東西。
  • 使用Reachability的通知自動重試。 當Reachability告訴您網絡可用時,這是因為它可用。 它可能會在你完成你的嘗試之前再次下降,它可能是一個專屬網絡,但現在是再次嘗試你的請求的好時機。

您可以在Mobile Safari中看到此行為。 如果頁面加載失敗,無論iPhone是否認為您有連接,您都可以重試。 如果網絡可用且Mobile Safari注意到,它將自動重試。 感覺真的很自然。

請記住以下准則:

  1. 移動網絡並不簡單。
  2. 唯一肯定的方式來確定網絡連接成功是嘗試一下,看看它是否沒有成功。
  3. 確定網絡連接是否實際成功並不總是微不足道的。

有幾個關於移動網絡的WWDC 2011會議值得關注。 (2010年有幾個也解決了這個問題,我相信WWDC 2012會有幾個。這不是一個簡單的問題,它不會消失。)

另外: initWithContentsOfURL是同步的。 不要在iOS上使用同步網絡。 如果需要很長時間,iOS應用程序將退出您的應用程序。

可達性的一個優點是它可以在連接狀態發生變化時向您發送通知。 這種方式可以通知您的用戶可能會限制某些功能。

所有的好處。 我將補充:考慮使用NSURLConnection。 它有一個委托協議,可以通知您在嘗試建立連接時發生的所有相關事件/事件。 它為您提供了更多的控制,即一個簡單的initWithCintentsOfURL方法,並允許異步處理。 但是如果你從許多類中使用它,那么多次實現所有委托方法可能會很麻煩。 我將它包裝在一個只有兩個委托方法的自定義類中: didFaildidFinish ,並在我的所有代碼中重用該類。

除了@ lxt的最佳答案之外,使用可訪問性的另一個好理由是,如果您未在應用內部執行盡職調查以考慮連接方案,則您的應用將被拒絕。 Apple將測試您的應用程序是否有連接,如果它在這些情況下失敗,您的應用程序甚至都不會被查看。

我全心全意地同意lxt的回答。 它為您提供了更多關於連接的詳細信息,而不僅僅是“我可以連接到某個網站”。 好問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM