NSNetService работает нормально, но не может получить hostName, разрешение вызывает ошибку - PullRequest
3 голосов
/ 27 июня 2011

Я использую 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;
}
* 1006.* что, очевидно, означает, что это уже решено.Опять же, все это происходит, пока я могу пользоваться сервисом.Также я могу получить порт, домен и тип сервиса.Единственная другая странная вещь - то, что вызов [адреса myNetService] возвращает пустой массив.

Я использую SDK 3.1.3.Кто-нибудь знает, что я могу делать не так?

Ответы [ 3 ]

5 голосов
/ 03 июня 2013

Метод [[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
}
3 голосов
/ 28 октября 2011

Вы можете получить имя хоста через [[NSProcessInfo processInfo] hostName] без разрешения только что опубликованной сетевой службы.

0 голосов
/ 14 октября 2014

Проверьте эту ссылку:

Это говорит о том, что ваша ошибка все еще пытается разрешить службу:

https://developer.apple.com/library/IOs/documentation/Cocoa/Reference/Foundation/Classes/NSNetService_Class/index.html#//apple_ref/c/tdef/NSNetServicesError

...