Проблемы NSNetService - PullRequest
       11

Проблемы NSNetService

0 голосов
/ 29 мая 2011

Я пытаюсь установить соединение 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.

Я уверен, что что-то упустил?

1 Ответ

5 голосов
/ 29 мая 2011

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

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

...