2010-10-31 22 views

risposta

61

Objective C

Il nome che cercavo è:

[[NSHost currentHost] localizedName]; 

Esso restituisce "MacBook di Jonathan" piuttosto che " Jonathans-Macbook ", o" jonathans-macbook.local "che restituisce solo name.

Swift 3

Per Swift> = 3 uso.

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

Si noti che [NSHost currentHost] esegue una ricerca di rete bloccante. Su una rete lenta o su un computer disconnesso, interromperà l'applicazione fino a quando la chiamata di rete scade, a meno che non la chiami su un thread in background. – starkos

+2

Basta passare una stringa vuota al momento della registrazione del servizio e il tuo nome localizzato verrà automaticamente utilizzato, come raccomandato dalla mela –

+0

C'è un modo per scrivere questo in Swift? – dylan

10

NSHost è ciò che si vuole qui:

NSHost *host; 

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

Sarà il nome descrittivo dell'utente (includendo cose come spazi e apostrofi) o la versione più scomoda in cui gli spazi vengono sostituiti con e rimossi. –

+0

Dal documento collegato: 'Può essere un semplice nome host, come @" vendite ", o un nome di dominio completo, come @" vendite.anycorp.com ".' –

+0

No Voglio dire sarà" MacBook di Jonathan "o" Jonathans-Macbook "? –

2

Ecco uno che non blocca:

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

Ora è deprecato. – Dev

6

Utilizzando la SystemConfiguration.framework, che è necessario aggiungere al progetto:

#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

Nota Apple non consiglia l'uso di questo metodo quando si registra un servizio Bonjour. Maggiori informazioni nella [Domande e risposte tecniche QA1228] (http://developer.apple.com/library/mac/#qa/qa1228/_index.html). – Dev

+0

Giusto per chiarire - il 'ComputerName' e' LocalHostName' sono distinti qui. Apple consiglia di non utilizzare LocalHostName poiché presenta limitazioni più rigide di quelle necessarie per i servizi Bonjour - e le API di registrazione automatica Bonjour utilizzano il ComputerName oltre a una certa magia di deduplicazione gratuitamente. – RJHunter

6

Io uso sysctlbyname (" kern.hostname "), che non blocca. Si prega di notare che il mio metodo di supporto dovrebbe essere usato solo per recuperare gli attributi di stringa, non interi.

#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

La migliore soluzione AFAIK, e non come 'SCDynamicStoreCopyLocalHostName', restituirà il suffisso" .local "necessario. –

Problemi correlati