如何获取Public IP

之前一朋友问如何获取Public IP,并没有发现很好的方法,直到看到一文章(文章在这儿),才突然恍然大迷瞪,本地获取Public IP或许并不是特别方便,但是在我们给后台服务器发送请求时,后台确是很容易可以获取到Public IP的。因为上篇文章使用的AFNetworking的3.0之前的版本且依赖于AFNetworking,所以打算将其抽离重新总结一下。

如果还想了解一下获取局域网IP的方法,之前在这里总结过

注意:这里使用还是HTTP的接口,在iOS9之后默认是只支持HTTPS的,所以看之前的《iOS9总结》解决

使用NSURLSession来获取数据,还是借用上篇文章中的地址(用人家的东西要说一声),在stackoverflow寻找解决方案时有几个地址,但是毕竟有伟大的防火墙的存在,所以还是用这个国内的地址比较靠谱,当然最好还是自己后台实现。
最直接的方式 show you the code

/*!
 *  @author JYFang
 *
 *  @brief 获取Public IP及其附加信息
 *
 *  @param withInfo 是否需要IP的附加信息,YES,则返回,NO,则只返回IP
 *  @param completionBlock 返回信息的回调
 */
+ (void)requestPublicIPWithInfo:(BOOL)withInfo completionBlock:(void(^)(NSString * _Nullable publicIP, NSDictionary * _Nullable info, NSError * _Nullable error))completionBlock
{

    [[[NSURLSession sharedSession]dataTaskWithURL:[NSURL URLWithString:@"http://ip.taobao.com/service/getIpInfo.php?ip=myip"] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (error) {
            completionBlock(nil,nil,error);
            return ;
        }
        NSDictionary *dataDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];
        if (error) {
            completionBlock(nil,nil,error);
            return;
        }
    
        NSInteger code = [dataDict[@"code"]integerValue];
        NSAssert(code == 0, @"The service response is wrong");
    
        NSDictionary *info = dataDict[@"data"];
        NSString *publicIp = info[@"ip"];
        if (withInfo) {
            completionBlock(publicIp,info,nil);
        }else{
            completionBlock(publicIp,nil,nil);
        }       
    }]resume];
}

使用时将其放到工具类中然后调用就可以了

[Util requestPublicIPWithInfo:YES completionBlock:^(NSString * _Nullable publicIP, NSDictionary * _Nullable info, NSError * _Nullable error) {
    if (error) {
        NSLog(@"error = %@",[error description]);
        return ;
    }
    NSLog(@"IP = %@ ,info = %@",publicIP,info);
}];

还有其他的一些处理方式,在stackoverflow上,可以看这儿,还有这儿

最后,代码片段放到Github上这儿

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,491评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 178,596评论 25 709
  • 名词延伸 通俗的说,域名就相当于一个家庭的门牌号码,别人通过这个号码可以很容易的找到你。如果把IP地址比作一间房子...
    杨大虾阅读 20,775评论 2 56
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,571评论 30 472
  • 直接调用即可.h .m
    EnjoyWT阅读 138评论 0 0

友情链接更多精彩内容