ho il seguente codice per scoprire i servizi sulla rete:NSNetServiceBrowser didRemoveService richiede più tempo dopo l'apertura di flusso
[netServiceBrowser setDelegate: self];
[netServiceBrowser searchForServicesOfType: serviceType inDomain: domain];
che si traduce in chiamate a questi due metodi (trovare servizio e rimuovere il servizio):
- (void) netServiceBrowser:(NSNetServiceBrowser*) netServiceBrowser
didFindService:(NSNetService*) netService ... {}
- (void) netServiceBrowser:(NSNetServiceBrowser*) netServiceBrowser
didRemoveService:(NSNetService*) netService ... {}
Questo funziona bene. Quando spengo il dispositivo I immediatamente riceve la chiamata RemoveService.
Tuttavia quando si apre una corrente (ingresso, uscita o entrambi) al dispositivo:
[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];
Si prende improvvisamente il NSNetServiceBrowser quasi un minuto per rilevare che ho spento il dispositivo
(ci vuole un minuto per didRemoveService da chiamare).
I dispositivi con cui non sto comunicando (apertura dei flussi con) chiamano ancora didRemoveService non appena li rimuovo.
Aggiornamento: Ecco un po 'più informazioni relative al mio problema.
Ho ho fatto funzionare una traccia con Wireshark e ho notato quanto segue:
comincio la mia applicazione nel simulatore iPad, l'applicazione si avvia un NSNetServiceBrowser e rileva la stampante. Dopodiché apre i flussi di input/output sul dispositivo (tramite airport express, usb). La stampante mi invia aggiornamenti di stato e quando tocco il pulsante di prova nella mia app , la stampante inizia a stampare. In Wireshark vedo tutte le comunicazioni con la stampante come previsto.
Ora quando avvio la stessa identica applicazione su iPad (e lascio il simulatore iPad in esecuzione). L'applicazione avvia anche il server NSNetServiceBrowser e rileva la stampante. La stampante è non mi sta inviando aggiornamenti di stato e quando tocco il pulsante di prova, la stampante non stampa. In Wireshark vedo la comunicazione. La stampante o l'aeroporto riceve i miei comandi e invia un pacchetto ACK.
Non appena ho ucciso l'app per simulatore iPad, la stampante inizia a stampare i comandi inviati dall'iPad. Sembra che aprire un socket blocca tutti gli eventi bonjour, come posso evitare che ciò accada?
Maggiori informazioni qui: https://devforums.apple.com/message/541436
Non appena chiudo i flussi, FiresService ha eseguito l'attivazione. Sembra che aspetti un qualche timeout? – Zyphrax
Non sono sicuro che sia questo il caso, ma date un'occhiata al flusso - (void): (NSStream *) aStream handleEvent: (NSStreamEvent) gestore di eventi. In Lion il gestore non viene più chiamato per l'evento NSStreamEventEndEncountered. Quindi, è necessario chiudere il flusso di input e rimuoverlo dal ciclo quando si è sicuri di aver ricevuto tutti i dati. Ad esempio quando avviene NSStreamEventHasBytesAvailable. – Davyd
Per coloro che hanno accesso al forum degli sviluppatori Apple. Ho postato il mio problema qui: https://devforums.apple.com/it/message/541436. Purtroppo ancora nessuna soluzione :( – Zyphrax