【问题标题】:How does the iOS simulator os macOS determine if it is offline or not?iOS模拟器os macOS如何判断是否离线?
【发布时间】:2017-06-04 22:55:12
【问题描述】:

所以,最近我在 Jenkins 上的构建中经常出现这个错误:

[00:28:47]: ▸ testSendingLocalModifications, failed - Failed to log in loginWithUsernamePasswordFailed(Error Domain=NSURLErrorDomain Code=-1009 "The Internet connection appears to be offline." UserInfo={NSUnderlyingError=0x60000025fda0 {Error Domain=kCFErrorDomainCFNetwork Code=-1009 "(null)" UserInfo={_kCFStreamErrorCodeKey=50, _kCFStreamErrorDomainKey=1}}, NSErrorFailingURLStringKey=https://example.net/oauth2/token, NSErrorFailingURLKey=https://staging-api-ec2.enquos.net/oauth2/token, _kCFStreamErrorDomainKey=1, _kCFStreamErrorCodeKey=50, NSLocalizedDescription=The Internet connection appears to be offline.})

它运行有时正常。在实际手机上运行时效果很好。所以看起来这与模拟器有关。这是在最新的 Sierra 上运行的。

我正试图准确地找出 它如何确定连接处于脱机状态。它是否只是相信如果它无法获取相关的 URL?或者它甚至没有真正尝试获取 URL,因为它认为它处于脱机状态。如果是这样,模拟器本身如何确定它是在线还是离线?底层主机具有连接性,因为它很乐意从 Github 中检查代码以编译和构建它。目前,构建成功与否的可能性似乎是 50/50。

如果我 VNC 到构建服务器并在模拟器上尝试 Safari,我可以正常访问网页,所以它看起来已经连接。

【问题讨论】:

    标签: ios xcode macos ios-simulator macos-sierra


    【解决方案1】:

    简而言之:

    import SystemConfiguration
    
    func isConnectedToInternet() -> Bool {
    
        var zeroAddress = sockaddr_in()
        zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress))
        zeroAddress.sin_family = sa_family_t(AF_INET)
    
        let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
            $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in
                SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)
            }
        }
    
        var flags = SCNetworkReachabilityFlags()
        if !SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) {
            return false
        }
        let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0
        let needsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
        return (isReachable && !needsConnection)
    }
    

    【讨论】:

      【解决方案2】:

      模拟器是一个单独的用户空间,共享主机操作系统内核,因此它共享主机操作系统网络堆栈。一般来说,如果 mac 认为它在线,那么 Simulator 也应该如此。

      如果您使用的是 8.3 Beta(最好在相关模拟器启动时),请提交错误并包含 sudo sysdiagnose -qxcrun simctl diagnose 的输出。这将有助于我们追查此事。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-11
        • 1970-01-01
        • 1970-01-01
        • 2011-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-15
        相关资源
        最近更新 更多