Как читать 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 ответа:
Сначала необходимо разрешить службу. В обратном вызове у вас есть все, что вы знаете, что сервис существует, но у вас нет его записей (ни его 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]; } }