Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何获取设备的公共IP地址_Ios_Objective C_Ip Address_Public - Fatal编程技术网

Ios 如何获取设备的公共IP地址

Ios 如何获取设备的公共IP地址,ios,objective-c,ip-address,public,Ios,Objective C,Ip Address,Public,我发现可以获取所有本地IP地址,但我没有找到一个简单的解决方案来获取公共IP 苹果公司的一名员工被允许这样做 ... 但这是我过去使用过的传统…。你基本上需要打一个外部电话来了解这一点 + (NSString *)externalIPAddress { // Check if we have an internet connection then try to get the External IP Address if (![self connectedViaWiFi] &am

我发现可以获取所有本地IP地址,但我没有找到一个简单的解决方案来获取公共IP

苹果公司的一名员工被允许这样做 ... 但这是我过去使用过的传统…

。你基本上需要打一个外部电话来了解这一点

+ (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;
    }
}
+(NSString*)外部填充{
//检查我们是否有internet连接,然后尝试获取外部IP地址
如果(![self-connectedViaWiFi]&&![self-connectedVia3G]){
//未连接到任何内容,返回nil
返回零;
}
//基于dynsns.org获取外部IP地址
n错误*错误=nil;
NSString*theIpHtml=[NSString stringWithContentsOfURL:[NSURL URLWithString:@]http://www.dyndns.org/cgi-bin/check_ip.cgi"]
编码:NSUTF8StringEncoding
错误:&错误];
如果(!错误){
NSU整数是一个_整数;
NSArray*ipItemsArray;
NSString*externalIP;
NSScanner*扫描仪;
NSString*text=nil;
扫描仪=[NSScanner SCANNER WITHING STRING:theIpHtml];
while([扫描仪显示]==否){
//查找标记的开始
[扫描程序扫描字符串:@“intoString:&text];
//用空格替换找到的标记
//(如果愿意,以后可以过滤多个空格)
theIpHtml=[theIpHtml字符串通过重复出现字符串:
[NSString stringWithFormat:@“%@>”,文本]
带字符串:@“];
ipItemsArray=[它们的PHTML组件由字符串分隔:@”“;
一个整数=[ipItemsArray indexOfObject:@“地址:”;
externalIP=[ipItemsArray objectAtIndex:++an_整数];
}
//检查一下你是否有东西回来

如果(externalIP==nil | | externalIP.length您必须查询外部服务器以查找公共IP。或者设置您自己的服务器(1行php代码)或者使用在http查询时以纯文本或json形式返回IP的多种可用方法中的一种。例如。

对于我们这些使用Swift的人,这里是我对Andrei答案的翻译,并添加了NSURLSession在后台运行。要检查网络,我使用。另外,请记住将dyndns.org添加到
NSExceptionDomains用于
info.plist
中的
NSAppTransportSecurity

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

}
var-ipAddress:String?
func getIPAddress(){
如果可达性!.isReachable()==false{
返回
}
guard let ipServiceURL=NSURL(字符串:http://www.dyndns.org/cgi-bin/check_ip.cgi)其他{
返回
}
let session=NSURLSession.sharedSession()
让task=session.dataTaskWithURL(ipServiceURL,completionHandler:{(数据,响应,错误)->中的Void
如果错误!=nil{
打印(错误)
返回
}
将ipHTML=NSString(数据:data!,编码:NSUTF8StringEncoding)设为?字符串
self.ipAddress=self.scanForIPAddress(ipHTML)
})
task.resume()
}
func scanForIPAddress(var ipHTML:String?->String{
如果ipHTML==nil{
归零
}
女士:字符串?
var指数:Int?
变量ipItems:[字符串]?
变量文本:NSString?
let scanner=NSScanner(字符串:ipHTML!)
而scanner.atEnd==false{
scanner.scanuptString(“,intoString:&text)
ipHTML=ipHTML!.stringByReplacingOccurrencesOfString(字符串(文本!)+“>”,带字符串:“”)
ipItems=ipHTML!。组件由字符串(“”)分隔
index=ipItems!.indexOf(“地址:”)
externalIPAddress=ipItems![++索引!]
}
如果让ip=ExternalPaddress{
打印(“外部IP地址:\(IP)”)
}
返回软垫
}

就这么简单:

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

我觉得安德烈和塔里克的回答都很有帮助。 两者都依赖web URL来查询iOS/OS X设备的“公共IP”

然而,在世界上的某些地方,这种方法存在一个问题,如andrei的回答中所述,URL(如“”)被审查:

NSString *theIpHtml = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.dyndns.org/cgi-bin/check_ip.cgi"]
encoding:NSUTF8StringEncoding
                                                  error:&error];
在这种情况下,我们需要在区域内使用“未经审查”的URL,例如

请注意,web URL可能使用不同于Andrei的答案所能解析的HTML和编码-在上面的URL中,一些非常温和的更改可以通过使用kCFStringEncodingGB_18030_2000来修复它


您可以调用公共IP地址查找服务来获取此信息?我已将其设置为以JSON/XML或纯文本形式返回设备IP地址的服务。您可以在此处找到它们

用于带有GeoIP数据的JSON

用于XML响应

用于纯文本IP地址

我使用并且没有抱怨

NSURL *url = [NSURL URLWithString:@"https://api.ipify.org/"];
NSString *ipAddress = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSLog(@"My public IP address is: %@", ipAddress);

谢谢@Tarek的回答

这里是Swift 4版本的代码

func getPublicIPAddress() -> String {
    var publicIP = ""
    do {
        try publicIP = String(contentsOf: URL(string: "https://www.bluewindsolution.com/tools/getpublicip.php")!, encoding: String.Encoding.utf8)
        publicIP = publicIP.trimmingCharacters(in: CharacterSet.whitespaces)
    }
    catch {
        print("Error: \(error)")
    }
    return publicIP
}
注1:要获得公共IP地址,我们必须有外部站点返回公共IP。我使用的网站是商业公司网站,因此,在业务消失之前,它将是他们的网站


注2:您可以自己创建一些站点,但是,苹果需要HTTPS站点才能使用此功能。

如果您想要异步检索IP,可以使用ipify.org和Alamofire在一行代码中实现:

Alamofire.request("https://api.ipify.org").responseString { (response) in
    print(response.result.value ?? "Unable to get IP")
}

我们不打电话就找不到它?如果“公共IP”是指“互联网将看到我来自的IP地址”如果不询问Internet的某些部分,就不可能知道这一点。NAT不会发生在您的设备上,而是发生在网络上。请注意,不同的设备可能会认为您具有不同的IP,这取决于您如何路由到它们(包括一些人可能会认为您拥有IPv4地址,而另一些人可能会认为您拥有IPv6地址)。“Internet”只是一个特定的网络;您可以使用不同的IP映射在许多不同的网络上并在这些网络之间进行路由。您好
Alamofire.request("https://api.ipify.org").responseString { (response) in
    print(response.result.value ?? "Unable to get IP")
}