NSNetService works fine, but can't get hostNam

2019-01-28 07:35发布

I'm using Bonjour with an NSNetService to publish a server from my iPhone. It all works as expected, I can browse the pages I'm serving etc. However, on the iPhone I want to display the host name (i.e. the URL, like "myDevice.local."), so that one can also enter the address manually in a browser (useful for clients missing a bonjour discovery service). My understanding is that calling the method [myNetService hostName] should give me that address. However, this call always returns nil. I read on some forum that I first should resolve the service, however both [myNetService resolve] and [myNetService resolveWithTimeout:10] call the delegate method

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

with the error

{
    NSNetServicesErrorCode = -72003;
    NSNetServicesErrorDomain = 10;
}

which apparently means that it is already resolved. Again, all this is happening while i can use the service. Also I can get the port, the domain, and the type of the service. The only other strange thing is that the call [myNetService addresses] returns an empty array.

I'm using SDK 3.1.3. Does anybody have an idea what I could be doing wrong?

3条回答
看我几分像从前
2楼-- · 2019-01-28 08:20

The [[NSProcessInfo processInfo] hostName] method was not useful for me for two reasons:

  • If celular data is active, it returns some weird hostname at my provider's domain
  • If there's only WiFi, the host name is ok, but all lower case

The following code from http://iphoneappcode.blogspot.com/2012/05/how-to-get-device-ipaddess-in-iphone.html worked best for me, always returning the local host name with sensitive case:

+ (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
}
查看更多
劳资没心,怎么记你
4楼-- · 2019-01-28 08:33

You can get the hostname via [[NSProcessInfo processInfo] hostName] without resolving the netservice you just published.

查看更多
登录 后发表回答