打开流后,NSNetServiceBrowser didRemoveService需要更长时间

Zyp*_*rax 7 bonjour objective-c stream nsnetservice nsnetservicebrowser

我有以下代码用于发现网络上的服务:

[netServiceBrowser setDelegate: self]; 
[netServiceBrowser searchForServicesOfType: serviceType inDomain: domain];
Run Code Online (Sandbox Code Playgroud)

这导致调用这两种方法(查找服务和删除服务):

- (void) netServiceBrowser:(NSNetServiceBrowser*) netServiceBrowser 
         didFindService:(NSNetService*) netService ... {}

- (void) netServiceBrowser:(NSNetServiceBrowser*) netServiceBrowser 
         didRemoveService:(NSNetService*) netService ... {}
Run Code Online (Sandbox Code Playgroud)

这很好用.当我关闭设备时,我立即收到didRemoveService调用.

但是,当我打开流(输入,输出或两者)到设备时:

[netService getInputStream: &inputStream outputStream: &outputStream];

[inputStream setDelegate: self];
[outputStream setDelegate: self];

[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
             forMode: NSDefaultRunLoopMode];
[inputStream open];

[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
              forMode:NSDefaultRunLoopMode];
[outputStream open];
Run Code Online (Sandbox Code Playgroud)

它突然需要NSNetServiceBrowser几乎一分钟来检测我关闭了设备
(调用didRemoveService需要一分钟).

我没有与之通信的设备(打开流)仍然会在我删除它们后立即调用didRemoveService.

更新: 这里有一些与我的问题相关的信息.

我跟Wireshark跑了一段路,注意到以下几点:

我在iPad模拟器中启动应用程序,应用程序启动NSNetServiceBrowser并检测打印机.之后,它打开输入/输出流到设备(通过机场快递,USB).打印机正在向我发送状态更新,当我点击应用程序中的测试按钮时,打印机开始打印.在Wireshark中,我看到了与打印机的所有通信.

现在,当我在iPad上启动完全相同的应用程序(并让iPad模拟器运行).应用程序也启动NSNetServiceBrowser,并检测打印机.打印机没有向我发送状态更新,当我点击测试按钮时,打印机没有打印.在Wireshark中,我看到了沟通.打印机或机场接收我的命令并发送ACK包.

一旦我杀死iPad模拟器应用程序,打印机就会开始打印我使用iPad发送的命令.似乎打开一个套接字阻止所有的bonjour事件,我怎么能防止这种情况发生?

更多信息:https://devforums.apple.com/message/541436

Zyp*_*rax 0

这似乎是机场快线的限制。

我当前使用 GCDAsyncSocket 的实现工作得很好,我只需要确保只使用一个套接字与机场快线通信。

我要结束这个问题了。