2010-10-21 104 views
2

我想要做的是在我的iPod touch上啓用簡單的Bonjour服務。 而我發佈我的自定義bonjour服務後,委託人沒有得到「netServiceDidPublish:」調用。我也檢查「netService:(NSNetService *)sender 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

我注意到了兩件事。首先,除非需要將其移動到不同的runloop(或模式),否則不應調用-scheduleInRunLoop:forMode:。它在默認情況下已經安排在當前運行循環中。其次,你似乎在自動釋放服務,這意味着一旦你回到runloop,它就會被釋放並釋放。你需要把它放在一個ivar或財產,並堅持下去。

+0

它確實有效。非常感謝。 – dokinkon 2010-10-29 14:00:43

2

不需要-scheduleInRunLoop:forMode。實際上,取決於證明你的課程的圖書館堆棧,你會得到不同的行爲,有些會失敗。你也需要retain你的NSNetService。

我學到了在runLoop調度NSNetServiceNSNetServiceBrowser一些不同的行爲:

  1. 在Mac OS X上的mDNS,正在從Foundation框架訪問,有一個在runloop無妨調度(測試它在Mac OS X 10.5,10.6,10.7和10.8上)。
  2. 如果您正在使用GNUstep的的libgnustep-base編譯的avahi兼容模式(./configure --with-zeroconf-api=avahi)它也可以,但我的情況,我如果用正在創建和釋放許多NSNetService情況下得到一些分割故障。
  3. 如果您使用的是在Apple的mDNS兼容模式(./configure --with-zeroconf-api=mdns)下編譯的GNUStep的libgnustep-base,它將不起作用。您將收到-72003錯誤,用於發佈NSNetService(錯誤將發生在-netService:didNotPublish:)以及用NSNetServiceBrowser進行瀏覽(錯誤將發生在-netServiceBrowser:didNotSearch:)。使用Avahi的mDNS兼容性代碼(libavahi-compat-libdnssd1)對此場景進行測試,並在沒有Avahi的情況下直接使用Apple的mDNS。