坑爹的苹果ipv6审核

/ 0评 / 0

上周五发布了一个新的版本,人后被拒了,我也是醉了,原因竟然是ipv6环境下不能登录,气愤之余,赶紧找了一大堆群问情况,原来很多人最近都因为这个被拒了,大吃一惊。
苹果要求在今年6月1号之后的所有APP都必须兼容ipv6,这个还是情有可原的,毕竟全球的ipv4 IP已经被分的差不多 了,然后就去查了查,只要不涉及底层的东西一般不用更改代码就行,这之前还是很放心的,毕竟之前三个版本都没有问题,然而这次被拒了。。。。
在网上查了资料,先看到了对于ipv6的解释,看一下下面的图就了解了

ipv6-001

我用的AFN 2.x,但是也是基于NSUrlConnection封装的呀,查询也是支持ipv6的呀(还是推荐最新版的AFN,我这里是因为二次封装了,要是现在换来不及了)

然而苹果给的测试方法如下图

ipv6-002

赶紧按照苹果给的搭建本地ipv6测试环境的方法搭建一个呀(图示网上拖的,自己没截图,哈哈)

ipv6-003

ipv6-004

ipv6-005

ipv6-006

ipv6-007

ipv6-008

ipv6-009

ipv6-010

ipv6-011

ipv6-012

经过上面测试,在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审核专家,不过略坑爹,有点贵,不过今天早上审核通过,新版本上了,还是可以的,经过这个事,觉得苹果真尼玛。。。算了,人在屋檐下,不得不低头呀。。。。自测一下

ipv6-test

评论已关闭。