如何测试iOS设备网络是使用IPv6还是IPv4?

时间:2015-12-24 09:23:34

标签: ios ipv6

iOS 9将使用仅IPv6网络。为了支持IPv6,我的iOS应用程序必须停止使用AF_INET(以及许多其他api,例如struct in_addr),而是使用AF_INET6。

但它也应该支持iOS 8及更早版本,因此我必须继续使用AF_INET。问题是如何知道系统使用的是哪个网络,IPv6还是IPv4?所以我可以根据不同的网络条件使用不同的apis。

2 个答案:

答案 0 :(得分:1)

在IPv6网络上审核应用。请确保您的应用支持IPv6网络,因为需要IPv6兼容性。

我在AFNetworkReachabilityManager类的AFNetworking Library中使用了此代码,现在它正常工作,我的应用程序已获Apple批准:)

+ (instancetype)sharedManager {
static AFNetworkReachabilityManager *_sharedManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{

#if (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 90000) || (defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101100)
    struct sockaddr_in6 address;
    bzero(&address, sizeof(address));
    address.sin6_len = sizeof(address);
    address.sin6_family = AF_INET6;
#else
    struct sockaddr_in address;
    bzero(&address, sizeof(address));
    address.sin_len = sizeof(address);
    address.sin_family = AF_INET;
#endif
    _sharedManager = [self managerForAddress:&address];
});

return _sharedManager;
}

答案 1 :(得分:0)

由于IPv6网络而导致Apple应用拒绝的解决方案

我对IPv6的互联网可访问性检查效果不佳。它总是显示没有网络。当我使用此代码时,苹果在24小时内批准了我的应用。 感谢

更改类AFNetworkReachabilityManager中的AFNetworking库

中的代码中的以下行

更改 AF_INET到AF_INET6;

+ (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_INET6;  //Change AF_INET TO AF_INET6
        _sharedManager = [self managerForAddress:&address];
    });

    return _sharedManager;
}