Как читать TXT записи с apple bonjour для iOS


Я попытался получить TXTrecords в функции didFindService, но оказалось, что значение равно null.

У вас есть какие-нибудь идеи, чтобы решить мою проблему?

- (void)netServiceBrowser:(NSNetServiceBrowser*)netServiceBrowser didFindService:(NSNetService*)service moreComing:(BOOL)moreComing {
    [self.services addObject:service];

    NSDictionary* dict = [[NSNetService dictionaryFromTXTRecordData:[service TXTRecordData]] retain];
    MyTreeNode *node = [[MyTreeNode alloc] initWithValue:[service name]];
    NSString* info = [self copyStringFromTXTDict:dict which:@"info"];
    if([info isEqualToString:@"child"]) { // info == null and dict == null??
        [treeNode addChild:node];
    }
    [info release];
    if (!moreComing) {
        [self sortAndUpdateUI];
    }
}
3 5

3 ответа:

Сначала необходимо разрешить службу. В обратном вызове у вас есть все, что вы знаете, что сервис существует, но у вас нет его записей (ни его A, ни его TXT).

Вы можете использовать -resolveWithTimeout: для его разрешения. Вы также можете использовать -startMonitoring, Если вам нужно получить уведомление при изменении записи TXT.

Я изменил свою функцию didFindService следующим образом (мое приложение основано на примере Apple "BonjourWeb"):

- (void)netServiceBrowser:(NSNetServiceBrowser*)netServiceBrowser didFindService:(NSNetService*)service moreComing:(BOOL)moreComing {
    [self.services addObject:service];
    NSInteger i,n = [self.services count];
    for(i=0;i<n;i++)
    {
        NSLog(@"%d %@",i,[[self.services objectAtIndex:i]name]);
        if (self.currentResolve) {
            [self stopCurrentResolve];
        }
        self.currentResolve = [self.services objectAtIndex:i];
        [self.currentResolve setDelegate:self];
        [self.currentResolve resolveWithTimeout:0.0];
        self.timer = [NSTimer scheduledTimerWithTimeInterval:20.0 target:self selector:@selector(showWaiting:) userInfo:self.currentResolve repeats:NO];
    }

    if (!moreComing) {
        [self sortAndUpdateUI];
    }
}

Я заметил, что при запуске моего приложения функция netServiceDidResolveAddress вызывается один раз, и она разрешает только последний элемент массива self.сервисы (у меня 11 сервисов, это решает только тот объект, который имеет индекс 10). Моя проблема заключается в том, чтобы все службы были решены.

Моя проблема решена вот окончательный код:

- (void)netServiceBrowser:(NSNetServiceBrowser*)netServiceBrowser didFindService:(NSNetService*)service moreComing:(BOOL)moreComing {
    [service setDelegate:self];
    [service resolveWithTimeout:0.0];
    [self.services addObject:service];

    if (!moreComing) {
        [self sortAndUpdateUI];
    }
}