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
}

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

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

https://developer.apple.com/library/IOs/documentation/Cocoa/Reference/Foundation/Classes/NSNetService_Class/index.html

Другие вопросы по тегам