【发布时间】:2015-08-18 14:08:42
【问题描述】:
我正在尝试检查我的 Swift 应用程序中的网络连接,并在一定秒数后超时。我正在运行 XCode 7 Beta。我使用的代码来自this问题的答案,在这里:
class func isConnectedToNetwork() -> Bool {
var zeroAddress = sockaddr_in()
zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
zeroAddress.sin_family = sa_family_t(AF_INET)
guard let defaultRouteReachability = withUnsafePointer(&zeroAddress, {
SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
}) else {
return false
}
var flags: SCNetworkReachabilityFlags = []
if SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) == 0 {
return false
}
let isReachable = flags.contains(.Reachable)
let needsConnection = flags.contains(.ConnectionRequired)
return (isReachable && !needsConnection)
}
此代码在大约一分二十秒后没有连接(使用 iOS 模拟器中的网络链接调节器)超时。我无法在网上找到任何使用此方法且超时的任何人的引用,这似乎非常奇怪,因为人们可以假设大多数应用程序超时将由开发人员指定,而不是任何预建方法设置。
另一种可能的方法是使用 NSURLConnection.sendSynchronousRequest() 和 NSMutableURLRequest 的 timeoutInterval 属性。这使用硬编码的 URL,这当然不太理想。如何使用此方法创建开发人员指定的连接超时?
【问题讨论】:
-
SCNetworkReachability 还有一个异步接口,使用在更改时自动调用的回调。 Swift 2 可以使用这个(基于 C 的)回调。请参阅我对 stackoverflow.com/a/27142665/1187415 的最新更新。
-
是否可以在不使用主机 url 的情况下使用 SCNetworkReachability 的异步模型?我仍在试图弄清楚这个过程,但它看起来像主机,用于可达性,正在尝试访问 google.com。无法访问 google.com 但有连接的情况会怎样?
标签: ios swift connection timeout xcode7