NSNetService:发布服务时处理名称冲突

时间:2015-07-01 11:50:29

标签: ios bonjour nsnetservice

根据Apple documentation

  

如果该服务名称与网络上的现有服务冲突,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:委托方法,但事实并非如此。

1 个答案:

答案 0 :(得分:0)

这里的问题是端口,而不是名称。

如果存在名称冲突,它会通过在名称后附加" (2)"来自动重命名服务,并根据需要增加数量。在这种情况下,它将成功发布并致电netServiceDidPublish:

如果该端口已被其他已发布服务使用,则不会发布该端口,并将调用netService:didNotPublish:并将错误字典设置为NSNetServicesErrorCode = 48; NSNetServicesErrorDomain = 1;