Objective c NSNetService工作正常,但可以';无法获取主机名,请解决导致错误的原因

Objective c NSNetService工作正常,但可以';无法获取主机名,请解决导致错误的原因,objective-c,ios,bonjour,hostname,nsnetservice,Objective C,Ios,Bonjour,Hostname,Nsnetservice,我正在使用Bonjour和NSNetService从我的iPhone发布服务器。一切正常,我可以浏览我正在服务的页面等。但是,在iPhone上,我想显示主机名(即URL,如“myDevice.local.”),这样人们也可以在浏览器中手动输入地址(对于缺少bonjour发现服务的客户很有用)。我的理解是,调用方法[myNetService hostName]应该给我这个地址。但是,此调用始终返回nil。我在某个论坛上读到,我应该首先解析服务,但是[myNetService resolve]和[m

我正在使用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。有人知道我做错了什么吗?

您可以通过[[NSProcessInfo processInfo]hostname]获取主机名,而无需解析刚刚发布的netservice。

由于两个原因,
[[NSProcessInfo processInfo]hostname]
方法对我没有用处:

  • 如果celular数据处于活动状态,它会在我的提供商的域中返回一些奇怪的主机名
  • 如果只有WiFi,主机名可以,但都是小写
来自的以下代码最适合我,总是返回带有敏感大小写的本地主机名:

+ (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
}
请查看此链接:

这表示您的错误,因为它仍在尝试解决该服务:


非常感谢,这解决了我的问题!我不知道我怎么会错过那种方法。我仍然想知道为什么另一种方法会失败。AcDcP有更好的答案——不仅是因为下面指出的原因,而且因为(正如我发现的困难的方式)NSProcessInfo主机名调用和阻塞很长一段时间。这可能会导致应用程序被锁定,或者(如果在启动过程中提前查找主机名)由于启动超时而被iOS杀死。