2011-10-04 90 views
11

我正在爲我正在開發的iOS項目開發的應用中使用Bonjour(NSNetServiceBrowser,準確地說)通過WiFi進行應用。iOS上的NSNetServiceBrowser/Bonjour問題

但是,儘管注意到在Why does NSNetServiceBrowser find unpublished services in iPhone OS?的優秀響應中提出的問題,但我仍然遇到了NSNetSericeBrowser的一些困難。

我的設置是如下:

  • 配備了iPad運行iOS 4.5.3的工作。
  • 將AirPort Express用作接入點/路由器。
  • 在連接到網絡的Mac上運行dns-sd -B _serviceName可以正常工作 - 也就是說,所有發佈和停止調用立即反映在桌面上。

不過,我已經經歷了以下幾個問題: - (約15分鐘+)已公佈了半天

  1. 服務往往得不到客戶端上刪除,即使他們從消失蘋果電腦!(即didRemoveService不會被調用)。
  2. 有時候,發佈的服務不會被網絡上的其他人看到,即使它們出現在Mac上也是如此(即didFindService未調用) - 這可能與下面的3/4點有關...因此,如果應用程序在iPad連接到網絡之前開始運行(並搜索),則它不會搜索新的網絡正常。
  3. 如果設備在發佈服務後更改網絡會發生什麼情況?我發現Bonjour 不是在新網絡上重新發布服務 - 如何強制這種情況發生?
  4. 如果設備更改網絡會發生什麼,而正在搜索服務?我發現這也會導致問題,並且往往會導致找不到會話(didFindService未被調用)。

我一直有的問題很奇怪,因爲Bonjour有90%的時間工作......只有10%破壞了我的應用程序的可靠性!煩人的是,所有上述問題都可以通過雙擊主頁按鈕並強制關閉應用程序,然後重新運行它來解決。再次運行後,它總是找到正確的會話或正確發佈。

避免這個問題的一種方法是拆卸並重新啓動NSNetServiceBrowser,只要無線網絡發生變化......但這看起來非常混亂和不必要。令人沮喪的是,Bonjour是一個高級API,沒有任何真正的選項來調整和測試。

任何想法,我可能會解決問題1-4?

謝謝!

+4

不明白爲什麼這個問題沒有收到更多的關注,我也有類似的問題,它非常刺激。 – jbat100

回答

6

OK,我設法解決它 - 如果任何人遇到這類使用Bonjour/NSNetServiceBrowser可靠性問題,這是我的解決方案:

1。計劃你的NSNetService和NSNetServiceBrowsers既如下:

[netService scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
[netServiceBrowser scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 

2.確保實現netServiceBrowser:didNotSearch:從NSNetServiceBrowserDelegate方法。

當NSNetService無法發佈時(無論出於何種原因),這將被解僱。我所做的就是在那裏放置一個UIAlertView,向用戶顯示一條消息,表示搜索無法完成,並且他們應該檢查他們的網絡連接。瀏覽似乎自動重新啓動後,一旦它能夠這樣做(但我需要看看,也許在我的代碼中的東西正在使它發生......)

+0

作爲後續工作,似乎Bonjour已經在iOS 5中進行了大修,所以現在可能會考慮一些不同的問題。 –

+0

這太棒了。謝謝。這正是我需要的 –

+2

謝謝,實際上我發現'netServiceBrowser:didNotSearch:'每次從背景回來時都會觸發。所以我所做的只是在沒有任何'UIAlertView'的情況下再次開始瀏覽。幾個月來一直這樣運行它,目前沒有任何不良影響... –