objective-c - NSNetService 工作正常,但无法获取主机名,解析导致错误

标签 objective-c ios bonjour hostname nsnetservice

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

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

错误

{
    NSNetServicesErrorCode = -72003;
    NSNetServicesErrorDomain = 10;
}

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

我使用的是 SDK 3.1.3。有人知道我可能做错了什么吗?

最佳答案

[[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
}

关于objective-c - NSNetService 工作正常,但无法获取主机名,解析导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6496129/

相关文章:

objective-c - 为所有 UIGestureRecognizer 添加目标

ios - 如何根据对象在 objective-c 中另一个数组中的顺序对一个数组进行排序?

ios - 无法在屏幕上显示,Xcode6.1.1

ios - 使用 ios 图表 swift 3 的折线图

swift - NetService 无法发布

ios - 将NSDictionary压缩为NSData的有效方法

ios - iPad 上的 Silverlight 支持吗?

ios - 我可以在 iOS 应用程序中设置设备级代理吗?如何?

iphone - 仅通过蓝牙设置 iPhone P2P,不使用 GKPeerPickerController

macos - 如何找出我的多播 (Bonjour) 主机名?