Проблемы с NSNetService

Я пытаюсь установить соединение Bonjour между устройством iOS и Mac. Обнаружение друг друга работает отлично, но у меня проблемы с 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, что правильно.

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.

Я уверен, что я что-то упускаю?


person Pripyat    schedule 29.05.2011    source источник


Ответы (1)


Только издатель службы может установить данные записи TXT. Исследователь опубликованной службы может прочитать запись TXT, но не может ее изменить. Запись TXT позволяет издателю службы публиковать дополнительные общедоступные данные, которые можно прочитать из записи DNS, не обращаясь к издателю напрямую.

ETA: По крайней мере, в документации NSNetService создается впечатление, что вам не нужно разрешать службу, прежде чем вы сможете получить данные записи TXT. В документации CFNetService отмечается, что вы должны разрешить службу, прежде чем сможете получить данные записи TXT. Как CFNetService, так и NSNetService, кажется, работают только с подмножеством возможных записей DNS-SD, которые могут быть созданы и обнаружены с помощью C API, описанного в <dns_sd.h>, который позволяет прикреплять несколько записей TXT к одной рекламируемой услуге.

person Jeremy W. Sherman    schedule 29.05.2011
comment
Старый поток, но это может быть полезно: насколько я понимаю, это не значит, что издатель NSNetService должен установить TXTRecordData (или что он должен быть сначала разрешен), но это объект, который имеет доступ к исходному NSNetService тогда как NSNetServiceBrowser находит копия оригинального NSNetService (запишите описание оригинала и найденного браузером, и вы увидите, что это разные экземпляры NSNetService). Таким образом, установка TXTRecordData в сервисе, найденном браузером, не означает его установку в исходном сервисе и, следовательно, приводит к сбою. - person Jon; 31.12.2014