Swift 中 IPv6 网络上的网络连接检查崩溃

2024-01-11

我最近有一个应用程序因不兼容 IPv6 而被拒绝。当调用以下代码时,应用程序导致崩溃。我怀疑崩溃是因为它利用了SCNetworkReachabilityCreateWithAddress当苹果建议不要再使用它时。

谁能帮我一下,让下面的代码与 IPv6 和 IPv4 兼容?

Code

import Foundation
import SystemConfiguration

public class Reachability {

    class func isConnectedToNetwork() -> Bool {

        var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0))
        zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
        zeroAddress.sin_family = sa_family_t(AF_INET)

        let defaultRouteReachability = withUnsafePointer(&zeroAddress) {
            SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0)).takeRetainedValue()
        }

        var flags: SCNetworkReachabilityFlags = 0
        if SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) == 0 {
            return false
        }

        let isReachable = (flags & UInt32(kSCNetworkFlagsReachable)) != 0
        let needsConnection = (flags & UInt32(kSCNetworkFlagsConnectionRequired)) != 0

        return isReachable && !needsConnection
    }

}

代码来源:

检查 Swift 中的互联网连接可用性 https://stackoverflow.com/questions/25398664/check-for-internet-connection-availability-in-swift

视图上的代码调用确实加载了:

if Reachability.isConnectedToNetwork() == false
{
      // internet is down
      let error = NSError(domain: "", code: 3, userInfo: nil)           let alertView = createDefaultAlertError(error.code)
      let tryAgainAction = UIAlertAction(title: ClassGeneralMessages().userMessageTryAgain, style: UIAlertActionStyle.Default) { (UIAlertAction) in                
}
else
{
     // internet is ok
     // run more code here
}

From Apple 有关支持纯 IPv6 网络的文档 https://developer.apple.com/library/mac/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html#//apple_ref/doc/uid/TP40010220-CH213-SW25:

无需预检即可连接

Reachability API(请参阅SC网络可达性参考 https://developer.apple.com/library/mac/documentation/SystemConfiguration/Reference/SCNetworkReachabilityRef/index.html#//apple_ref/doc/uid/TP40007260)用于识别连接问题后的诊断目的。许多应用程序错误地使用这些 API 通过调用SCNetworkReachabilityCreateWithAddress方法并向其传递 IPv4 地址 0.0.0.0,这表明网络上有路由器。然而,路由器的存在并不能保证互联网连接的存在。一般来说,避免预检网络可达性。只需尝试建立连接并优雅地处理故障即可。如果您必须检查网络可用性,请避免致电SCNetworkReachabilityCreateWithAddress方法。致电SCNetworkReachabilityCreateWithName方法并传递给它一个主机名。

您的应用程序似乎正在做它建议反对的两件事:

  1. 使用可达性 API 执行预检,而不是仅在出现连接问题时执行。
  2. 将 IPv4 文字传递给可达性 API,而不是主机名。

为了解决这个问题,我建议不要预先检查网络连接,而是处理网络代码中的错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 中 IPv6 网络上的网络连接检查崩溃 的相关文章

随机推荐