【问题标题】:NSNetService: Handle name conflicts when publish serviceNSNetService:发布服务时处理名称冲突
【发布时间】:2015-07-01 11:50:28
【问题描述】:

根据苹果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: 委托方法,但事实并非如此。

【问题讨论】:

    标签: ios bonjour nsnetservice


    【解决方案1】:

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

    如果发生名称冲突,它会自动重命名服务,方法是在名称后面附加" (2)",并根据需要增加数字。在这种情况下,它将成功发布并调用netServiceDidPublish:

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

    【讨论】:

    • 谢谢!创建 NSNetService 实例时,我将端口更改为 0:self.publishService = [[NSNetService alloc] initWithDomain:@"local." type:self.serviceIdentifier name:self.bonjourName port:0];。我还必须将发布方法更改为[self.publishService publishWithOptions:NSNetServiceListenForConnections];
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 2020-08-16
    • 2013-01-06
    • 2019-02-27
    • 1970-01-01
    相关资源
    最近更新 更多