2015-09-23 5 views
6

Ho un server in esecuzione localmente (il mio IP è 192.168.0.98) e ho sperimentato con qualche codice di rete per accedervi. In origine questo è stato fatto tramite AFNetworking, ma l'ho fatto ora con un NSURLSession come questo:NSURLSession non riesce quando si tenta di assegnarci IP invece di localhost o home

NSURLSession *session = [NSURLSession sharedSession]; 
NSURL *url = [NSURL URLWithString:@"http://192.168.0.98:8080/api"]; 
NSURLSessionDataTask *task = [session dataTaskWithURL: url 
            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
             NSLog(@"Error: %@", error); 
             NSLog(@"Body: %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); 
            }]; 
[task resume]; 

ho quindi eseguirlo con queste 3 URL:

  • http://localhost:8080/api -> opere.
  • http://127.0.0.1:8080/api -> funziona.
  • http://192.168.0.98:8080/api -> fallisce con l'errore:

    Error Domain=NSPOSIXErrorDomain 
    Code=2 "No such file or directory" 
    UserInfo={ 
        NSErrorFailingURLStringKey=http://192.168.0.98:8080/api, 
        NSErrorFailingURLKey=http://192.168.0.98:8080api, 
        _kCFStreamErrorCodeKey=2, 
        _kCFStreamErrorDomainKey=1 
    } 
    

Dove 192.168.0.98 è l'IP assegnato a questa macchina. Se eseguo questi URL da PAW o da un browser, funziona perfettamente. Ma da un test unitario fallisce.

Dal punto di vista del mio progetto, posso semplicemente usare localhost. Quindi questo non è un interruttore. Ma sono curioso del perché non funzioni.

Qualcuno ha idea di quale potrebbe essere il problema?

+2

a supposizione perché quell'host non può essere raggiunto o non è stato ascoltato processo sulla porta 8080 su quell'indirizzo – Paulw11

+0

Infatti; hai provato questo usando 'telnet' o' netcat' o qualcosa dalla riga di comando? – trojanfoe

+0

Ho provato a utilizzare un client REST e va bene con tutti gli URL. 192.168.0.98 è in realtà questa macchina. Trace route mostra lo stesso percorso per 192.168.0.98, localhost e 127.0.0.1. È solo AfNetworking che sta avendo un problema con questo. – drekka

risposta

5

tl; dr: utilizzare il proprio nome di dominio Bonjour local link anziché il proprio indirizzo IP.

Mi sono imbattuto in questo problema. Sto creando un'API localmente e non voglio ancora effettuare la distribuzione su un server esterno, ma devo chiamare l'API sia dal simulatore che dai dispositivi. All'inizio ho provato a usare localhost, ma ovviamente non funziona per i dispositivi, dal momento che localhost sarebbe il dispositivo stesso, non il mio Mac. L'indirizzo IP ha funzionato per i dispositivi, ma non funziona nel simulatore. Ho poi ricordato che posso usare il nome di dominio .local per il mio Mac per altre indirizzabilità di rete, e sicuramente funziona. Posso usare http://mymac.local/ come URL di base per le mie richieste API sia sul simulatore che sui miei dispositivi di test.

Non sono sicuro del motivo per cui l'utilizzo dell'indirizzo IP effettivo non funziona, ma questo potrebbe darvi un'opzione che funzionerà per le vostre esigenze.

+3

'sudo scutil --get LocalHostName' fornirà il nome locale da usare nell'url: http: //'localHostName'.local/ –