Ios 如何获取设备的公共IP地址
我发现可以获取所有本地IP地址,但我没有找到一个简单的解决方案来获取公共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
+ (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")
}