繁体   English   中英

NSNetService 问题

[英]NSNetService Problems

我正在尝试在 iOS 设备和 Mac 之间建立 Bonjour 连接。 发现彼此效果很好,但我遇到了setTXTRecordData:的问题。 它总是失败(BOOL 返回 NO)...

_serviceInstances 创建:

-(void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)aNetService moreComing:(BOOL)moreComing
{
    [aNetService retain];

    [aNetService setDelegate:self];
    [aNetService startMonitoring];

    [aNetService performSelectorOnMainThread:@selector(resolve) withObject:nil waitUntilDone:YES];
[_serviceInstances addObject:aNetService];
}

发送尝试:

NSNetService*service = [_serviceInstances objectAtIndex:[servicesTable selectedRow]];

[service setDelegate:self];

NSDictionary*txtRecordDataDictionary = [NSDictionary dictionaryWithObject:@"2" forKey:@"Version"];

if (service)
{
    BOOL success = [service setTXTRecordData:[NSNetService dataFromTXTRecordDictionary:txtRecordDataDictionary]];   

    if (!success)
    {
        NSRunCriticalAlertPanel(@"Sync Error", @"Failed to contact Client. Please restart Carbon on your iPad and try again.", @"OK", nil, nil);
    }

    NSLog(@"Service: %@",service);
}

NSLog 消息输出Service: <NSNetService 0x441b40> local. _test._tcp. David's iPad Service: <NSNetService 0x441b40> local. _test._tcp. David's iPad Service: <NSNetService 0x441b40> local. _test._tcp. David's iPad是正确的。

iOS 代码:

NSNetService*service = [[NSNetService alloc] initWithDomain:@"local." type:@"_test._tcp." name:[[UIDevice currentDevice] name] port:28];
[service setDelegate:self];
[service setTXTRecordData:nil];
[service publish];

[service startMonitoring];


- (void)netService:(NSNetService *)sender didUpdateTXTRecordData:(NSData *)data
{
    NSLog(@"Got Data! of %@",sender);

    NSPropertyListFormat format;
    NSDictionary*dict = [NSPropertyListSerialization propertyListFromData:data mutabilityOption:NSPropertyListImmutable format:&format errorDescription:nil];


    UIAlertView *myAlert = [[UIAlertView alloc]
                            initWithTitle:[sender name] message:[dict objectForKey:@"Version"]
                            delegate:self 
                            cancelButtonTitle:nil
                            otherButtonTitles:@"OK", nil];
    [myAlert show];  
    [myAlert release];
}

出于某种原因,当我启动 iPad 应用程序(除标题之外的空白内容)但不响应来自我的 Mac 的任何信号时,会调用警报。

我确定我错过了什么?

只有服务的发布者才能设置 TXT 记录数据。 已发布服务的发现者可以读取 TXT 记录,但不能更改它。 TXT 记录为服务的发布者提供了一种发布其他公开可读数据的方法,这些数据可以从 DNS 条目中读取,而无需直接联系发布者。

ETA:至少, NSNetService的文档看起来好像您不需要解析服务就可以获取 TXT 记录数据。 CFNetService文档指出,您必须先解析服务,然后才能获取 TXT 记录数据。 CFNetServiceNSNetService似乎都只适用于可能的 DNS-SD 记录的子集,这些记录可以使用<dns_sd.h>中描述的 C API 创建和发现,它允许将多个 TXT 记录附加到单个广告服务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM