美文网首页
如何获取Public IP

如何获取Public IP

作者: 懒得起名的伊凡 | 来源:发表于2016-01-19 11:49 被阅读661次

    之前一朋友问如何获取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上这儿

    相关文章

      网友评论

          本文标题:如何获取Public IP

          本文链接:https://www.haomeiwen.com/subject/iwikkttx.html