NSNetService工作正常,但无法获取hostName,解决导致错误

时间:2011-06-27 16:45:37

标签: objective-c ios bonjour hostname nsnetservice

我正在使用Bonjour和NSNetService从我的iPhone发布服务器。这一切都按预期工作,我可以浏览我正在服务的页面等。但是,在iPhone上我想显示主机名(即URL,如“myDevice.local。”),这样一个人也可以进入在浏览器中手动设置地址(对于缺少bonjour发现服务的客户非常有用)。我的理解是调用方法[myNetService hostName]应该给我那个地址。但是,此调用始终返回nil。我在一些论坛上读到我首先要解析服务,但[myNetService resolve]和[myNetService resolveWithTimeout:10]都调用了委托方法

- (void)netService:(NSNetService *)sender didNotResolve:(NSDictionary *)errorDict;

错误

{
    NSNetServicesErrorCode = -72003;
    NSNetServicesErrorDomain = 10;
}

这显然意味着它已经解决了。同样,所有这一切都发生在我可以使用该服务的时候。我也可以获得端口,域和服务类型。唯一的另一个奇怪的事情是调用[myNetService addresses]返回一个空数组。

我正在使用SDK 3.1.3。有没有人知道我可能做错了什么?

3 个答案:

答案 0 :(得分:5)

[[NSProcessInfo processInfo] hostName]方法对我没用,原因有两个:

  • 如果celular数据处于活动状态,则会在我的提供商的域中返回一些奇怪的主机名
  • 如果只有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
}

答案 1 :(得分:3)

您可以通过[[NSProcessInfo processInfo] hostName]获取主机名,而无需解析刚刚发布的网络服务。

答案 2 :(得分:0)