3

我正在使用 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 地址] 返回一个空数组。

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

4

3 回答 3

5

[[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
}
于 2013-06-03T17:59:10.417 回答
3

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

于 2011-10-28T16:31:52.197 回答
0

检查此链接:

这表示您的错误仍在尝试解决服务:

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

于 2014-10-14T11:05:00.963 回答