2011-10-04 25 views
11

Tôi đang sử dụng Bonjour (NSNetServiceBrowser, chính xác) qua WiFi trong ứng dụng tôi đang phát triển cho một dự án iOS mà tôi đang thực hiện.Các vấn đề về NSNetServiceBrowser/Bonjour trên iOS

Tuy nhiên, mặc dù lưu ý các vấn đề được nêu ra trong phản hồi tuyệt vời tại Why does NSNetServiceBrowser find unpublished services in iPhone OS? Tôi vẫn gặp phải một số khó khăn với NSNetSericeBrowser.

tôi thiết lập như sau:

  • Làm việc với iPad chạy iOS 4.5.3.
  • Sử dụng AirPort Express làm điểm truy cập/bộ định tuyến.
  • Chạy dns-sd -B _serviceName trên máy Mac của tôi được kết nối với mạng hoạt động tốt - tức là, tất cả các cuộc gọi để xuất bản và dừng đều được phản ánh ngay trên màn hình.

Tuy nhiên, tôi đã trải qua những vấn đề sau: - (. Khoảng 15mins +)

  1. dịch vụ được xuất bản trong một thời gian dài có xu hướng không bị loại bỏ trên khách hàng mặc dù họ biến mất khỏi Mac! (ví dụ: didRemoveService không được gọi).
  2. Đôi khi các dịch vụ được xuất bản không được thấy bởi những người khác trên mạng, mặc dù chúng xuất hiện trên máy Mac! (tức là didFindService không được gọi) - điều này có thể liên quan đến các điểm 3/4 bên dưới ... theo đó nếu ứng dụng bắt đầu chạy (và tìm kiếm) trước khi iPad được kết nối với mạng thì nó không tìm kiếm mạng đúng cách.
  3. Điều gì sẽ xảy ra nếu thiết bị thay đổi mạng sau khi xuất bản một dịch vụ? Tôi đã thấy rằng Bonjour không không xuất bản lại dịch vụ trên mạng mới - làm cách nào để buộc điều này xảy ra?
  4. Điều gì xảy ra nếu thiết bị thay đổi mạng trong khi tìm kiếm dịch vụ? Tôi đã tìm thấy rằng điều này gây ra vấn đề quá, và nó có xu hướng kết quả trong phiên không được tìm thấy (didFindService không được gọi).

Các vấn đề tôi gặp phải rất lạ, vì Bonjour hoạt động 90% thời gian ... chỉ 10% làm hỏng độ tin cậy của ứng dụng của tôi! Điều khó chịu này là TẤT CẢ các vấn đề trên có thể được giải quyết bằng cách nhấn đúp nút home và đóng ứng dụng, sau đó chạy lại nó. Sau khi chạy nó một lần nữa, nó luôn luôn tìm thấy các phiên chính xác hoặc xuất bản đúng cách.

Một cách để tránh vấn đề này là phá bỏ và khởi động lại NSNetServiceBrowser bất cứ khi nào mạng không dây bị thay đổi ... nhưng điều này có vẻ rất lộn xộn và không cần thiết. Điều bực bội là Bonjour là một API cấp cao mà không có bất kỳ tùy chọn thực tế nào để tinh chỉnh và kiểm tra.

Bất kỳ ý tưởng nào về cách tôi có thể sắp xếp các vấn đề 1-4?

Cảm ơn!

+4

Không hiểu tại sao câu hỏi này chưa nhận được sự chú ý nhiều hơn, tôi có vấn đề tương tự và nó thực sự khó chịu. – jbat100

Trả lời

6

OK, tôi quản lý để giải quyết nó - và trong trường hợp bất cứ ai khác đang trải qua những loại vấn đề độ tin cậy với Bonjour/NSNetServiceBrowser, đây là giải pháp của tôi:

1.Schedule cả NSNetService và NSNetServiceBrowsers của bạn như sau:

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

2. Hãy chắc chắn rằng bạn thực hiện netServiceBrowser: didNotSearch: Phương pháp từ NSNetServiceBrowserDelegate.

Điều này sẽ bị kích hoạt khi NSNetService không thể xuất bản (vì bất kỳ lý do gì). Những gì tôi đã làm được đặt một UIAlertView trong đó để hiển thị một tin nhắn cho người dùng nói rằng tìm kiếm không thể được hoàn thành và rằng họ nên kiểm tra kết nối mạng của họ. Duyệt dường như để tự động bắt đầu lại khi có thể làm như vậy (nhưng tôi cần xem xét điều này, có thể có điều gì đó trong mã của tôi đang xảy ra ...)

+0

Theo dõi, có vẻ như Bonjour đã được đại tu trong iOS 5 nên có thể có một loạt các vấn đề khác nhau hiện đang được xem xét. –

+0

Điều này thật tuyệt vời. Cảm ơn. Đó là chính xác những gì tôi cần –

+2

Cảm ơn, trên thực tế, tôi thấy rằng 'netServiceBrowser: didNotSearch:' được kích hoạt mỗi khi ứng dụng quay trở lại từ nền. Vì vậy, tất cả những gì tôi làm trong phương thức đó chỉ là bắt đầu duyệt lại mà không có bất kỳ 'UIAlertView' nào. Đã chạy nó như thế này trong một vài tháng nay mà không có ảnh hưởng xấu cho đến nay ... –

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