NSNetService works fine, but can't get hostName, resolve causes error

那年仲夏 提交于 2019-11-28 08:48:40

问题


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?


回答1:


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




回答2:


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
}



回答3:


Check this link out:

This says your error it was still trying to resolve the service:

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



来源:https://stackoverflow.com/questions/6496129/nsnetservice-works-fine-but-cant-get-hostname-resolve-causes-error

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!