本人使用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。