iOS可达性类以支持IPv6

4

我在我的应用程序中使用可达性类来监测网络状态。以下是检查互联网可达性的代码,取自苹果公司的可达性示例。它可以很好地处理IPv4网络,但在IPv6 WiFi网络上失败。

+ (instancetype)reachabilityForInternetConnection
{
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
return [self reachabilityWithAddress:&zeroAddress];
}

现在我们正在为应用程序支持IPv6网络进行升级。当我们将这些代码升级以支持IPv6时,如下所示。

        struct sockaddr_in6 zeroAddress;
        bzero(&zeroAddress, sizeof(zeroAddress));
        zeroAddress.sin6_len = sizeof(zeroAddress);
        zeroAddress.sin6_family = AF_INET6;
        return [self reachabilityWithAddress: &zeroAddress];

上述IPv6支持代码在iOS9及更高版本设备中针对IPv4和IPv6 wifi网络均能正常工作。但是在iOS8设备中,它无法支持IPv4网络。因此,是否有关于苹果的可达性代码的更新可用来支持IPv6网络。

任何帮助将不胜感激。先感谢您的帮助。


我在我的应用程序中使用可达性类来监控网络状态。每当wifi状态发生变化(切换网络,关闭wifi等),对于所有这些情况,我的应用程序都将通过networkReachabilityChanged回调进行通知。一旦收到此通知,我们的应用程序将尝试登录到该热点,或者如果连接已经可用,则更新主UI。为此,我正在寻找IPv6网络支持。 - user1856666
1个回答

0

我认为如果您用以下代码替换,它将对您有效。

+(Reachability*)reachabilityWithHostName:(NSString*)hostname
{
   return [Reachability reachabilityWithHostname:hostname];
}

还有一个

+(Reachability*)reachabilityWithHostname:(NSString*)hostname
{
SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithName(NULL, [hostname UTF8String]);
if (ref) 
{
    id reachability = [[self alloc] initWithReachabilityRef:ref];

    return reachability;
}

return nil;
}

使用以下代码初始化可达性类,你可以使用“google.com”作为域名来检查网络连接。

  Reachability *r = [Reachability reachabilityForInternetConnection:@"your domain here"];

希望这能对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接