2014-12-30 24 views

risposta

7

ho usato ALSystemUtilities in passato. Fondamentalmente devi effettuare una chiamata esternamente per scoprirlo.

+ (NSString *)externalIPAddress { 
    // Check if we have an internet connection then try to get the External IP Address 
    if (![self connectedViaWiFi] && ![self connectedVia3G]) { 
     // Not connected to anything, return nil 
     return nil; 
    } 

    // Get the external IP Address based on dynsns.org 
    NSError *error = nil; 
    NSString *theIpHtml = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.dyndns.org/cgi-bin/check_ip.cgi"] 
                encoding:NSUTF8StringEncoding 
                 error:&error]; 
    if (!error) { 
     NSUInteger an_Integer; 
     NSArray *ipItemsArray; 
     NSString *externalIP; 
     NSScanner *theScanner; 
     NSString *text = nil; 

     theScanner = [NSScanner scannerWithString:theIpHtml]; 

     while ([theScanner isAtEnd] == NO) { 

      // find start of tag 
      [theScanner scanUpToString:@"<" intoString:NULL] ; 

      // find end of tag 
      [theScanner scanUpToString:@">" intoString:&text] ; 

      // replace the found tag with a space 
      //(you can filter multi-spaces out later if you wish) 
      theIpHtml = [theIpHtml stringByReplacingOccurrencesOfString: 
         [ NSString stringWithFormat:@"%@>", text] 
                  withString:@" "] ; 
      ipItemsArray = [theIpHtml componentsSeparatedByString:@" "]; 
      an_Integer = [ipItemsArray indexOfObject:@"Address:"]; 
      externalIP =[ipItemsArray objectAtIndex:++an_Integer]; 
     } 
     // Check that you get something back 
     if (externalIP == nil || externalIP.length <= 0) { 
      // Error, no address found 
      return nil; 
     } 
     // Return External IP 
     return externalIP; 
    } else { 
     // Error, no address found 
     return nil; 
    } 
} 

Fonte da ALSystemUtilities

+0

Non possiamo trovare senza chiamata? –

+0

Nel momento in cui l'ho esaminato non sono riuscito a trovare un altro modo ... – Andrei

+5

Se con "IP pubblico" intendi "l'indirizzo IP che Internet mi vedrà come proveniente" allora non è possibile sapere senza chiedere parte di Internet. NAT non si verifica sul tuo dispositivo; si verifica sulla rete. Tieni presente che dispositivi diversi potrebbero vederti come aventi un IP diverso a seconda di come li indirizzi (inclusa la possibilità che alcuni possano vedere che hai un indirizzo IPv4 e altri che ti vedono con un indirizzo IPv6). "Internet" è solo una rete particolare; puoi essere attivo e instradare tra molte reti diverse con mappature IP diverse. –

0

Hai per interrogare un server esterno per scoprire l'IP pubblico. Configurare il proprio server (1 riga di codice php) o utilizzare uno dei tanti disponibili che restituiscono l'IP come testo normale o JSON su query http. Ad esempio, http://myipdoc.com/ip.php.

0

Per quelli di noi che utilizzano Swift, ecco la mia traduzione della risposta di Andrei con l'aggiunta di NSURLSession per eseguirlo in background. Per controllare la rete, io uso Reachability.swift. Inoltre, ricorda di aggiungere dyndns.org a NSExceptionDomains per NSAppTransportSecurity nel tuo info.plist.

var ipAddress:String? 
func getIPAddress() { 

    if reachability!.isReachable() == false { 
     return 
    } 

    guard let ipServiceURL = NSURL(string: "http://www.dyndns.org/cgi-bin/check_ip.cgi") else { 
     return 
    } 

    let session = NSURLSession.sharedSession() 

    let task = session.dataTaskWithURL(ipServiceURL, completionHandler: {(data, response, error) -> Void in 
     if error != nil { 
      print(error) 
      return 
     } 

     let ipHTML = NSString(data: data!, encoding: NSUTF8StringEncoding) as? String 

     self.ipAddress = self.scanForIPAddress(ipHTML) 

    }) 

    task.resume() 
} 

func scanForIPAddress(var ipHTML:String?) -> String? { 

    if ipHTML == nil { 
     return nil 
    } 

    var externalIPAddress:String? 
    var index:Int? 
    var ipItems:[String]? 
    var text:NSString? 

    let scanner = NSScanner(string: ipHTML!) 

    while scanner.atEnd == false { 
     scanner.scanUpToString("<", intoString: nil) 

     scanner.scanUpToString(">", intoString: &text) 

     ipHTML = ipHTML!.stringByReplacingOccurrencesOfString(String(text!) + ">", withString: " ") 

     ipItems = ipHTML!.componentsSeparatedByString(" ") 

     index = ipItems!.indexOf("Address:") 
     externalIPAddress = ipItems![++index!] 

    } 

    if let ip = externalIPAddress { 
     print("External IP Address: \(ip)") 
    } 

    return externalIPAddress 

} 
8

E 'semplice come questo:

NSString *publicIP = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"https://icanhazip.com/"] encoding:NSUTF8StringEncoding error:nil]; 
publicIP = [publicIP stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]]; // IP comes with a newline for some reason 
+1

funziona, è un modo breve e semplice per ottenere l'indirizzo IP !! grazie –

+1

soluzione perfetta – gstream79

+4

Hahaha. Non so quanto mi fidi della longevità di un sito con il dominio 'icanhazip.com'. :) – LucasTizma

0

Trovo sia Andrei e le risposte di Tarek utile. Entrambi si affidano a un URL Web per interrogare "l'IP pubblico" del dispositivo iOS/OS X.

Tuttavia, c'è un problema con questo approccio in qualche parte del mondo in cui URL quale "http://www.dyndns.org/cgi-bin/check_ip.cgi" è censurato come nella risposta di andrei:

NSString *theIpHtml = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.dyndns.org/cgi-bin/check_ip.cgi"] 
encoding:NSUTF8StringEncoding 
                error:&error]; 

In questo caso, avremo bisogno di utilizzare un URL "uncensored" all'interno della regione, come http://1212.ip138.com/ic.asp

Nota che l'URL web potrebbe utilizzare un diverso HTML e la codifica di quello che la risposta di Andrei in grado di analizzare - nell'URL sopra, alcuni cambiamenti molto gentile può risolvere il problema utilizzando kCFStringEncodingGB_18030_2000 per http://1212.ip138.com/ic.asp

NSURL* externalIPCheckURL = [NSURL URLWithString: @"http://1212.ip138.com/ic.asp"]; 
encoding:NSUTF8StringEncoding error:nil]; 

NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); 

NSString *theIpHtml = [NSString stringWithContentsOfURL: externalIPCheckURL 
                encoding: encoding 
                 error: &error]; 
+0

Hi Yushen; questa è un'informazione utile, ma non è una risposta completa di per sé, quindi dovrebbe essere pubblicata come commento su una o entrambe le altre risposte a cui fai riferimento. Al momento, non hai abbastanza reputazione per fare commenti; per ora, è necessario lavorare sulla pubblicazione di domande utili e utili risposte complete per guadagnare la reputazione di aggiungere commenti. –