2015-12-21 22 views
5

Ich verwende NSNetService und NSNetServiceBrowser, um Bonjour-Dienste im Netzwerk zu veröffentlichen und nach ihnen zu suchen. Die Implementierung funktioniert einwandfrei, die Dienste befinden sich im Netzwerk und sie können kommunizieren. Ich versuche zur Zeit des Rahmen des Lebenszyklus zu verstehen, und das, was ich bisher habe:Wissen über den Status eines Bonjour-Dienstes

// Scanning 
netServiceBrowserWillSearch: 
netServiceBrowser:didFindService:moreComing: // The device finds itself 

// Advertising 
netServiceWillPublish: 
netServiceDidPublish: 

Dies geschieht, wenn ich die Dienste mit dem Adapter auf starten. Jetzt muss ich jederzeit wissen, ob der Dienst im Netzwerk aktiv beworben wird. das heißt, wenn andere Geräte es finden können. So teste ich es mit dem Adapter Wi-Fi ausgeschaltet:

netServiceBrowser:didRemoveService:moreComing: 
netServiceBrowser:didFindService:moreComing: // The device finds itself again, even after the adapter is turned off 

Dann drehe ich den Adapter wieder auf:

netServiceBrowser:didRemoveService:moreComing: 
netServiceBrowser:didFindService:moreComing: // Yet again 

Das Problem ist, dass es absolut keinen Unterschied in den Adapter ein- oder Aus, so kann ich nicht nach einem Muster suchen. Gibt es eine andere Möglichkeit, diese Ereignisse zu erfassen?

Edit: Es wird am schlimmsten. Auch wenn ich die Dienste mit beiden Adaptern aus starte (Flugzeugmodus) wird netServiceDidPublish: immer noch angerufen. Bis jetzt scheint es, dass netServiceDidNotPublish: nur aufgerufen wird, wenn ich versuche, den gleichen Dienst zweimal zu registrieren. Das ist mir sehr entgegengesetzt; vielleicht wurde der Dienst auf dem Adapter veröffentlicht, aber nicht auf dem Netzwerk, und als solche sind diese Rückrufe sehr irreführend. An dieser Stelle kann ich nicht wissen, ob der Dienst im Netzwerk sichtbar ist.

+0

Ich stieß auf das gleiche Problem. Hast du eine Lösung dafür gefunden? – Mark

+0

@Mark, gerade eine Antwort geschrieben. Viel Glück! –

Antwort

0

Als zukünftige Referenz musste ich Workarounds verwenden, um dies zu lösen. Das Problem ist, dass Bonjour seine Dienste im Protokollstapel veröffentlicht, sodass der Adapter nie nach dem Status abgefragt wird. Dies ist sinnvoll, da Bonjour ein Multi-Transport-Protokoll ist. Um dies zu lösen, habe ich eine Adaption von Apples reachability Framework verwendet, um Adapterzustandsänderungen für Infrastructural Wi-Fi zu hören, an welcher Stelle ich query the adapter for the presence of the adwl0 interface für Wi-Fi direkte Unterstützung. Wichtiger Hinweis: Dieser Artikel behauptet, Unterstützung für allgemeine Wi-Fi-Konnektivität zu finden , die nicht wahr ist; Die Schnittstelle awdl0 ist die Wi-Fi Direct-Schnittstelle, weshalb dies in Geräten wie dem iPhone 4/4S fehlschlagen wird. Dies ist in Ordnung, da diese Geräte Wi-Fi Direct nicht unterstützen. Da Bonjour auch mit Bluetooth funktioniert, verwende ich CoreBluetooth, um Änderungen des Bluetooth-Adapterstatus zu hören. Obwohl dieses Framework für Bluetooth Low Energy gedacht ist, glaube ich, dass der eingeschaltete Bluetooth-Adapter eine starke Garantie dafür ist, dass die Bonjour-Dienste im Netzwerk sichtbar sind. Es ist ein bisschen bedauerlich, dass Apple dies ohne Workarounds nicht erlaubt, aber das ist es, was wir bekommen, denke ich.