如何测试 iOS 设备网络是使用 IPv6 还是 IPv4?
Posted
技术标签:
【中文标题】如何测试 iOS 设备网络是使用 IPv6 还是 IPv4?【英文标题】:how to test iOS device network is using IPv6 or IPv4? 【发布时间】:2015-12-24 09:23:33 【问题描述】:ios 9 将使用纯 IPv6 网络。为了支持 IPv6,我的 iOS 应用程序必须停止使用 AF_INET(以及许多其他 api,例如 struct in_addr),而是使用 AF_INET6。
但它应该也支持iOS 8及更早版本,所以我不得不继续使用AF_INET。问题是如何知道系统使用的是哪个网络,IPv6 还是 IPv4?所以我可以根据不同的网络情况使用不同的api。
【问题讨论】:
在某些使用 AF_INET6 的系统上将同时支持 IPv4 和 IPv6。我不知道iOS是不是这样。 iOS 9 并不意味着手机或运营商将仅支持 IPv6。但这是一种可能。请参阅Apple's web site 了解更多信息。 【参考方案1】:应用在 IPv6 网络上进行审核。请确保您的应用支持 IPv6 网络,因为需要兼容 IPv6。
我已在 AFNetworkReachabilityManager 类的 AFNetworking 库中使用此代码,现在它工作正常,我的应用程序已获得 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;
【讨论】:
【参考方案2】:由于 IPv6 网络导致 Apple 应用被拒绝的解决方案
我对 IPv6 的互联网可达性检查运行不正常。它总是显示没有网络。当我使用此代码时,Apple 在 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;
【讨论】:
同时支持 IPv4 和 IPv6以上是关于如何测试 iOS 设备网络是使用 IPv6 还是 IPv4?的主要内容,如果未能解决你的问题,请参考以下文章