在Objective-C中获取公共IP?

And*_*dan 1 ip external objective-c ip-address

在我的应用程序中,我需要获取一个NSString对象值等于用户公共/互联网IP地址的值.我试图解决这个问题,但两者都返回本地IP地址而不是公开.以下是我的两种方法.一个更精确,并始终返回数组中的正确项.另一个没有.(因为只选一个随机索引)...

- (NSString *)getPublicIP {   
    NSHost *publicIP = [[[NSHost currentHost] addresses] objectAtIndex:0];
    return publicIP;  
}
Run Code Online (Sandbox Code Playgroud)

其他更精确:(但不获得公共IP)

 //start get ip
- (NSString *)getIPWithNSHost { 

NSArray *addresses = [[NSHost currentHost] addresses];
NSString *stringAddress;
for (NSString *anAddress in addresses) {
    if (![anAddress hasPrefix:@"127"] && [[anAddress componentsSeparatedByString:@"."] count] == 4) {
    stringAddress = anAddress;
    break;
    }
    else {
    stringAddress = @"IPv4 address not available" ;

}
    //NSLog(stringAddress);
}
NSLog (@"getIPWithNSHost: stringAddress = %@ ",stringAddress); 
stringAddress = (@"getIPWithNSHost: stringAddress = %@ ",stringAddress);

return  stringAddress;

}
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,我只需要一种方法来获取外部/公共/互联网IP地址.(只是为了澄清外部/公共/互联网IP是可以从whatsmyip.org检索的)

Jus*_*ser 5

这是iOS友好版的joshbillions答案:

+(void)getPublicIP:(void(^)(NSString *))block {
    NSURL *url = [NSURL URLWithString:@"http://checkip.dyndns.org"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [[[NSURLSession sharedSession]dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        if (error) {
            // consider handling error
        } else {
            NSString *html = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
            NSCharacterSet *numbers = [NSCharacterSet characterSetWithCharactersInString:@"0123456789."];
            NSString *ipAddr = [[html componentsSeparatedByCharactersInSet:numbers.invertedSet]componentsJoinedByString:@""];
            if (block) {
                block(ipAddr);
            }
        }
    }]resume];
}
Run Code Online (Sandbox Code Playgroud)