iOS模拟器os macOS如何确定它是否脱机?

时间:2017-01-20 03:04:48

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

所以,最近我在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,因为它认为它是脱机的。如果是这样,模拟器本身如何确定它是在线还是离线?底层主机具有连接,因为它很乐意从Github检查代码以编译和构建它。目前,构建成功或不成功的几率为50/50。

如果我VNC到构建服务器并在模拟器上尝试Safari,我可以很好地访问网页,所以它似乎已经连接了。

2 个答案:

答案 0 :(得分:0)

简而言之:

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)
}

答案 1 :(得分:0)

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

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