NSNetService работает нормально, но не может получить hostName, разрешение вызывает ошибку
Я использую Bonjour с NSNetService для публикации сервера с моего iPhone. Все работает как положено, я могу просматривать страницы, которые я обслуживаю и т. Д. Однако на iPhone я хочу отобразить имя хоста (то есть URL-адрес, например, "myDevice.local."), Чтобы можно было также ввести адрес вручную в браузере (полезно для клиентов, у которых отсутствует служба обнаружения Bonjour). Насколько я понимаю, вызов метода [myNetService hostName] должен дать мне этот адрес. Однако этот вызов всегда возвращает ноль. На каком-то форуме я прочитал, что сначала должен разрешить службу, однако и [myNetService resolv], и [myNetService resolWithTimeout:10] вызывают метод делегата
- (void)netService:(NSNetService *)sender didNotResolve:(NSDictionary *)errorDict;
с ошибкой
{
NSNetServicesErrorCode = -72003;
NSNetServicesErrorDomain = 10;
}
что, очевидно, означает, что это уже решено. Опять же, все это происходит, пока я могу пользоваться сервисом. Также я могу получить порт, домен и тип сервиса. Единственная другая странная вещь - то, что вызов [адреса myNetService] возвращает пустой массив.
Я использую SDK 3.1.3. У кого-нибудь есть идея, что я могу делать неправильно?
3 ответа
Вы можете получить имя хоста через [[NSProcessInfo processInfo] hostName] без разрешения только что опубликованного сетевого сервиса.
[[NSProcessInfo processInfo] hostName]
метод был бесполезен для меня по двум причинам:
- Если клеточные данные активны, они возвращают странное имя хоста в домене моего провайдера.
- Если есть только WiFi, имя хоста в порядке, но все строчные
Следующий код из http://iphoneappcode.blogspot.com/2012/05/how-to-get-device-ipaddess-in-iphone.html работал лучше всего, всегда возвращая имя локального хоста с чувствительным регистром:
+ (NSString *) hostname
{
char baseHostName[256];
int success = gethostname(baseHostName, 255);
if (success != 0) return nil;
baseHostName[255] = '\0';
#if !TARGET_IPHONE_SIMULATOR
return [NSString stringWithFormat:@"%s.local", baseHostName];
#else
return [NSString stringWithFormat:@"%s", baseHostName];
#endif
}
Проверьте эту ссылку:
Это говорит о том, что ваша ошибка все еще пытается разрешить службу: