2010-10-31 2 views

ответ

61

Objective C

Имя, которое я искал это:

[[NSHost currentHost] localizedName]; 

возвращает "MacBook Джонатана", а не " Jonathans-Macbook ", или" jonathans-macbook.local ", который возвращается только name.

Свифта 3

Для Swift> = 3 использования.

if let deviceName = Host.current().localizedName { 
    print(deviceName) 
} 
+9

Имейте в виду, что [NSHost currentHost] выполняет поиск блокирующей сети. В медленной сети или отключенном компьютере он остановит ваше приложение до тех пор, пока время сети не истечет, если вы не назовете его фоновым потоком. – starkos

+2

Просто передайте пустую строку при регистрации сервиса, и ваше локализованное имя будет автоматически использовано, как рекомендовано apple –

+0

Есть ли способ написать это в Swift? – dylan

10

NSHost является то, что вы хотите здесь:

NSHost *host; 

host = [NSHost currentHost]; 
[host name]; 
+0

Будет ли это удобное для пользователя имя (включая такие вещи, как пробелы и апострофы), или тумблерную версию, где места заменены на - и «удалены». –

+0

От связанного документа: 'Может быть либо простое имя хоста, например @" sales ", либо полное доменное имя, например @" sales.anycorp.com ". –

+0

Нет. Я имею в виду, будет ли это« MacBook Джонатана » "или" Джонатанс-Макбук "? –

2

Вот тот, который не блокирует:

NSString* name = [(NSString*)CSCopyMachineName() autorelease]; 
+3

Теперь это устарело. – Dev

6

Использование SystemConfiguration.framework, который необходимо добавить к вашему проекту:

#include <SystemConfiguration/SystemConfiguration.h> 

... 

// Returns NULL/nil if no computer name set, or error occurred. OSX 10.1+ 
NSString *computerName = [(NSString *)SCDynamicStoreCopyComputerName(NULL, NULL) autorelease]; 

// Returns NULL/nil if no local hostname set, or error occurred. OSX 10.2+ 
NSString *localHostname = [(NSString *)SCDynamicStoreCopyLocalHostName(NULL) autorelease]; 
+2

Обратите внимание: Apple не рекомендует использовать этот метод при регистрации услуги Bonjour. Дополнительная информация в [Technical Q & A QA1228] (http://developer.apple.com/library/mac/#qa/qa1228/_index.html). – Dev

+0

Просто для пояснения - здесь 'ComputerName' и' LocalHostName' здесь различны. Apple рекомендует против использования LocalHostName, поскольку у нее более строгие ограничения, чем это необходимо для услуг Bonjour, - и API автоматической регистрации Bonjour использует ComputerName плюс некоторые магии дедупликации бесплатно. – RJHunter

6

Я использую sysctlbyname (» kern.hostname "), который не блокируется. Обратите внимание, что мой вспомогательный метод должен использоваться только для получения строковых атрибутов, а не целых чисел.

#include <sys/sysctl.h> 

- (NSString*) systemInfoString:(const char*)attributeName 
{ 
    size_t size; 
    sysctlbyname(attributeName, NULL, &size, NULL, 0); // Get the size of the data. 
    char* attributeValue = malloc(size); 
    int err = sysctlbyname(attributeName, attributeValue, &size, NULL, 0); 
    if (err != 0) { 
     NSLog(@"sysctlbyname(%s) failed: %s", attributeName, strerror(errno)); 
     free(attributeValue); 
     return nil; 
    } 
    NSString* vs = [NSString stringWithUTF8String:attributeValue]; 
    free(attributeValue); 
    return vs; 
} 

- (NSString*) hostName 
{ 
    NSArray* components = [[self systemInfoString:"kern.hostname"] componentsSeparatedByString:@"."]; 
    return [components][0]; 
} 
+1

Лучшее решение AFAIK, а не как 'SCDynamicStoreCopyLocalHostName', оно вернет необходимый суффикс« .local ». –

Смежные вопросы