2011-06-27 40 views
3

我使用Bonjour與NSNetService從我的iPhone發佈服務器。這一切都按預期工作,我可以瀏覽我正在服務的頁面等。但是,在iPhone上我想顯示主機名稱(即URL,如「myDevice.local。」),以便還可以輸入在瀏覽器中手動尋址(對於缺少bonjour發現服務的客戶端有用)。我的理解是,調用方法[myNetService hostName]應該給我那個地址。但是,這個調用總是返回nil。我在一些論壇上閱讀,我首先應該解決的服務,但是兩者[myNetService解析]和[myNetService resolveWithTimeout:10]調用的委託方法NSNetService工作正常,但無法獲得hostName,解決原因錯誤

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

與錯誤

{ 
    NSNetServicesErrorCode = -72003; 
    NSNetServicesErrorDomain = 10; 
} 

這顯然意味着它已經解決了。同樣,所有這些都在我可以使用該服務的情況下發生。另外我可以獲得端口,域和服務的類型。唯一另外一件奇怪的事情是調用[myNetService addresses]返回一個空數組。

我正在使用SDK 3.1.3。有沒有人知道我可能做錯了什麼?

回答

3

您可以通過[[NSProcessInfo processInfo] hostName]獲取主機名,而無需解析剛剛發佈的netservice。

+0

非常感謝你,這解決了我的問題!我不知道我怎麼會錯過這個方法。我仍然想知道爲什麼其他方法失敗。 – mkeiser

+0

AcDcP有更好的答案 - 不僅出於下面所述的原因,還因爲(因爲我發現困難的方式)NSProcessInfo主機名稱調用和阻塞很長一段時間。這可能會導致應用程序鎖定或(如果在啓動期間提前查找主機名)導致它由於啓動超時而被iOS殺死。 – sckor

4

[[NSProcessInfo processInfo] hostName]方法不適合我有用的,原因有二:

  • 如果celular數據是活動的,則返回在我的供應商網域一些奇怪的主機名
  • 如果只有無線網絡,主機名是確定,但所有小寫

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 
} 
相關問題