最新消息:关注【太平洋学习网】微信公众号,可以获取全套资料,【全套Java基础27天】【JavaEE就业视频4个月】【Android就业视频4个月】

ios ipv6审核被拒解决方案分析|ipv4转ipv6

IOS 太平洋学习网 浏览 评论

本人使用GCDAsyncSocket类库开发了一个ios聊天app,但是因为ipv6审核被拒了,在上线之前并没有想到过什么ipv6或ipv4的概念,毕竟这是我人生第一次开发ios项目,以为程序没有bug苹果就能审核通过。

在审核被拒之后,给我回复了一条英文消息,其中最重要的一句就是:

Apps are reviewed on an IPv6 network. Please ensure that your app supports IPv6 networks, as IPv6 compatibility is required.

意思就是说我的程序不支持ipv6的网络环境,也许是因为我们在中国没有ipv6,只有ipv4的概念,在美国可能已经有很多人或公司使用ipv6网络了,因为ipv4已经不够用了。

于是我只好用自己的mac苹果电脑,然后使用手机wifi搭建了一个ipv6的网络环境,然后用另外一台手机测试了一下自己的聊天app,app连登录都无法登录。

mac苹果电脑如何搭建ipv6网络测试环境,请查看教程:不用网线搭建IPV6网络测试环境 这一篇文章。

GCDAsyncSocket中可以自定义一个方法,将ipv4转换成ipv6地址,如下。

 #pragma mark ipv4转化ipv6,host传入的是如:192.168.1.114 这样的地址
 
-(NSString *)convertHostToAddress:(NSString *)host {    
    NSError *err = nil;    
    NSMutableArray *addresses = [GCDAsyncSocket lookupHost:host port:0 error:&err];   
    //NSLog(@"address%@",addresses);    
    NSData *address4 = nil;
    NSData *address6 = nil;    
    for (NSData *address in addresses)
    {
        if (!address4 && [GCDAsyncSocket isIPv4Address:address])
        {
            address4 = address;
        }
        else if (!address6 && [GCDAsyncSocket isIPv6Address:address])
        {
            address6 = address;
        }
    }    
    NSString *ip;    
    if (address6) {
        //NSLog(@"ipv6:%@",[GCDAsyncSocket hostFromAddress:address6]);
        ip = [GCDAsyncSocket hostFromAddress:address6];
    }else {
        //NSLog(@"ipv4:%@",[GCDAsyncSocket hostFromAddress:address4]);
        ip = [GCDAsyncSocket hostFromAddress:address4];
    }    
    return ip;   
}

我其实并没有在NSURLSession接口请求中使用前面定义的:[xxxx convertHostToAddress:ip]方法来转换ipv4地址,而只是在连接socket服务器的时候才使用了这个转换方法,但是奇怪的是,NSURLSession接口请求并未受到影响,在ipv6环境下仍然能正常获取数据。

都怪我没有认真测试,现在忘记了,我猜测,在ipv6网络测试环境下,如果是http请求,则无需将ip4地址转换成ipv6,只有在socket下才需要ipv4转ipv6。

来源网站:太平洋学习网,转载请注明出处:http://www.tpyyes.com/a/object-c_ios/2017/1113/375.html

    与本文相关的文章

    发表我的评论
    取消评论

    表情

    您的回复是我们的动力!

    • 昵称 (必填)

    网友最新评论