2015-07-01 3 views
0

Согласно Apple, documentation:NSNetService: Обрабатывать конфликты имен, когда публикуют службы

Если это имя службы конфликтует с существующей службой по сети, Bonjour выбирает новое имя. ... ваш сервис автоматически переименовывается, если он конфликтует с именем существующей службы в сети.

Как достичь этой функции?

Моя реализация:

self.publishService = [[NSNetService alloc] initWithDomain:@"local." type:@"_http._tcp." name:@"MyName" port:80]; 
self.publishService.delegate = self; 
[self.publishService publish]; 

- (void)netServiceDidPublish:(NSNetService *)sender { 
    NSLog(@"did publish: %@", sender.name); 
} 

- (void)netService:(NSNetService *)sender didNotPublish:(NSDictionary *)errorDict { 
    NSLog(@"did not publish: %@", errorDict); 
} 

Когда эта услуга уже опубликован метод didNotPublish делегат будет вызван. Я полагаю, что услуга не будет опубликована?

Я думал, что метод делегата netServiceDidPublish: должен быть вызван снова для службы с новым именем, но это не так.

ответ

0

Проблема в том, что это порт, а не имя.

Если возникает конфликт имен, он автоматически переименовывает службу, добавляя " (2)" к имени, увеличивая число, насколько это необходимо. В этом случае он будет опубликован успешно и вызовет netServiceDidPublish:.

Если порт уже используется другой опубликованной услугой, он не будет публиковать его и будет звонить netService:didNotPublish: с помощью словаря ошибок, установленного на NSNetServicesErrorCode = 48; NSNetServicesErrorDomain = 1;.

+0

Спасибо! При создании экземпляра NSNetService я изменил порт на 0: 'self.publishService = [[NSNetService alloc] initWithDomain: @" local. " type: self.serviceIdentifier name: self.bonjourName port: 0]; '. Мне также нужно изменить метод публикации на '[self.publishService publishWithOptions: NSNetServiceListenForConnections];'. – Sebastian

Смежные вопросы