2010-10-21 2 views
2

что я хочу сделать, это включить простой сервис bonjour на моем iPod touch. И после того, как я опубликовал свою собственную услугу bonjour, делегат не получил вызов «netServiceDidPublish:». Я также проверяю, нет ли какого-либо сообщения об ошибке из «netService: (NSNetService *) отправитель didNotPublish:». Ниже мой код раздела:NSNetservice не получил приглашение делегата netServiceDidPublish

// AsyncSocket class comes from an awesome project: cocoa async socket. 
// http://code.google.com/p/cocoaasyncsocket/ 
AsyncSocket* listenSocket; 

listenSocket = [[AsyncSocket alloc] initWithDelegate:self]; 
NSError *error; 
if (![listenSocket acceptOnPort:0 error:&error]) 
{ 
    NSLog(@"Error starting server: %@", error); 
    return NO; 
} 

int port = [listenSocket localPort]; 

NSLog(@"Server started on port: %hu", port); 
isRunning = YES; 

// register itself to bonjour service. 
netService = [[[NSNetService alloc] initWithDomain:@"local." 
              type:@"_sampleservice._tcp" 
              name:@"myservice" 
              port:port] autorelease]; 

if (!netService) 
{ 
    NSLog(@"Failed to enable net service"); 
    [listenSocket disconnect]; 
    return NO; 
} 

[netService setDelegate:self]; 
[netService scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
//[netService publishWithOptions:NSNetServiceNoAutoRename]; 
[netService publish]; 

После этого участка кода, я могу получить «netServiceWillPublish» делегированное вызов, но нет «netServiceDidPublish» Есть ли у кого-либо идеи? Заранее спасибо.

ответ

6

Две вещи, которые я заметил. Во-первых, вы не должны звонить -scheduleInRunLoop:forMode:, если вам не нужно переместить его в другую runloop (или режим). По умолчанию он уже запланирован в текущем цикле. Во-вторых, вы оказываетесь автореализацией службы, что означает, что она будет освобождена и отменена, как только вы вернетесь в runloop. Вы должны придерживаться его в иваре или собственности и держаться за него.

+0

Это действительно работало. Огромное спасибо. – dokinkon

2

Нет необходимости -scheduleInRunLoop:forMode. Фактически, в зависимости от стека библиотеки, который доказывает ваш класс NSNetService, вы получите разные варианты поведения, некоторые из них потерпят неудачу. Также вам понадобится retain ваш NSNetService.

некоторых типов поведения, которые я узнал в течение календарного планирования NSNetService или NSNetServiceBrowser на runLoop:

  1. В MDNS на Mac OS X, к которому имеет доступ Foundation рамок, нет никакого планирования вреда на runloop (тестировал на Mac OS X 10.5, 10.6, 10.7 и 10.8).
  2. Если вы используете GNUtep's libgnustep-base, скомпилированный в режиме совместимости с Avahi (./configure --with-zeroconf-api=avahi), он также работает, но в моем случае я получил некоторые ошибки сегментации, если используется множество созданных и выпущенных экземпляров NSNetService.
  3. Если вы используете GNUStep libgnustep-base, скомпилированный в режиме совместимости mDNS от Apple (./configure --with-zeroconf-api=mdns), это не сработает. Вы получите ошибку -72003 как для публикации NSNetService (ошибка поступит в -netService:didNotPublish:), так и для просмотра в NSNetServiceBrowser (ошибка будет в -netServiceBrowser:didNotSearch:). Протестировал этот сценарий как с кодом совместимости mDNS Avahi (libavahi-compat-libdnssd1), так и с использованием mDNS от Apple напрямую, без Avahi.
Смежные вопросы