上周五发布了一个新的版本,人后被拒了,我也是醉了,原因竟然是ipv6环境下不能登录,气愤之余,赶紧找了一大堆群问情况,原来很多人最近都因为这个被拒了,大吃一惊。
苹果要求在今年6月1号之后的所有APP都必须兼容ipv6,这个还是情有可原的,毕竟全球的ipv4 IP已经被分的差不多 了,然后就去查了查,只要不涉及底层的东西一般不用更改代码就行,这之前还是很放心的,毕竟之前三个版本都没有问题,然而这次被拒了。。。。
在网上查了资料,先看到了对于ipv6的解释,看一下下面的图就了解了
我用的AFN 2.x,但是也是基于NSUrlConnection封装的呀,查询也是支持ipv6的呀(还是推荐最新版的AFN,我这里是因为二次封装了,要是现在换来不及了)
然而苹果给的测试方法如下图
赶紧按照苹果给的搭建本地ipv6测试环境的方法搭建一个呀(图示网上拖的,自己没截图,哈哈)
经过上面测试,在4s/5s/6上都是可以用的呀,哎呀我嘞个去,醉了,然后又在网上查询资料,有人说AFN2.x网络监测的代码是有点问题的,我赶紧去改,来看一下改的哪里
+ (instancetype)managerForAddress:(const void sockaddr_in*)address {
SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr *)address);
AFNetworkReachabilityManager *manager = [[self alloc] initWithReachability:reachability];
manager.networkReachabilityAssociation = AFNetworkReachabilityForAddress;
return manager;
}
//改成下面的
+ (instancetype)managerForAddress:(const void sockaddr_in6*)address {
SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr *)address);
AFNetworkReachabilityManager *manager = [[self alloc] initWithReachability:reachability];
manager.networkReachabilityAssociation = AFNetworkReachabilityForAddress;
return manager;
}
//然而上面那一处并不是这样,不用改了
//另一处
+ (instancetype)sharedManager {
static AFNetworkReachabilityManager *_sharedManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
struct sockaddr_in address;
bzero(&address, sizeof(address));
address.sin_len = sizeof(address);
address.sin_family = AF_INET;
_sharedManager = [self managerForAddress:&address];
return _sharedManager;
}
//改成下面的
+ (instancetype)sharedManager {
static AFNetworkReachabilityManager *_sharedManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
double version = [[UIDevice currentDevice].systemVersion doubleValue];
if (version >= 9.0f) {
struct sockaddr_in6 address;
bzero(&address, sizeof(address));
address.sin6_len = sizeof(address);
address.sin6_family = AF_INET6;
_sharedManager = [self managerForAddress:&address];
} else {
struct sockaddr_in address;
bzero(&address, sizeof(address));
address.sin_len = sizeof(address);
address.sin_family = AF_INET;
_sharedManager = [self managerForAddress:&address];
}
});
return _sharedManager;
}
//还有人说请求的时候要做以下设置,我觉得并没有这个必要,但是还是贴出来吧
AFJSONResponseSerializer *response = [AFJSONResponseSerializer serializer];
response.removesKeysWithNullValues = YES;
//response.acceptableContentTypes = [NSSet setWithObject:@"application/json"];
response.acceptableContentTypes = nil;
mgr.responseSerializer = response;
mgr.securityPolicy = [AFSecurityPolicy defaultPolicy];
mgr.securityPolicy.allowInvalidCertificates = YES;
mgr.securityPolicy.validatesDomainName = NO;
改好了,周一利马打包上线,然而周二依然被拒,尼玛,要爆炸了。
后来在群里有人说可能是因为域名解析的问题,可能美国访问不稳定,还有就是要有一个4A的解析记录,我也试试吧,由于国内几乎没有服务器供应商提供ipv6地址,那怎么办嘞,有人说直接买个云解析,解析稳定就可以了,他们就是这样干的,俺木有买,俺们运维直接搞了个ipv6审核专家,不过略坑爹,有点贵,不过今天早上审核通过,新版本上了,还是可以的,经过这个事,觉得苹果真尼玛。。。算了,人在屋檐下,不得不低头呀。。。。自测一下