我想知道是否有人知道如何检测iOS应用程序中是否存在数据传输。我正在使用Swift Reachability库来检测是否存在wifi或蜂窝连接,但这并不让我知道是否有实际的数据正在传输。
我的应用程序从WKWebView开始,在没有数据传输的情况下,加载占据整个屏幕的user视图,我想向用户展示一个alertController。
可达性让我知道是否有一个连接到无线或蜂窝网络,但他们没有帮助让我知道是否有任何数据正在传输。我正在用wifi进行测试,但是没有网络连接,而且我无法显示任何alertController,因为连接总是为isReachable()传递true。
有人知道怎么做吗?谢谢。
发布于 2016-10-27 04:30:49
Alamofire提供了检查网络状态的功能。因此,这里详细介绍了一些其他功能。
我在我的项目中创建了一个APIClient管理器类。
import UIKit
import Alamofire
import AlamofireNetworkActivityIndicator
// Completion handeler
typealias TSAPIClientCompletionBlock = (response: NSHTTPURLResponse?, result: AnyObject?, error: NSError?) -> Void
// MARK: -
class TSAPIClient: Manager {
// MARK: - Properties methods
private let manager = NetworkReachabilityManager(host: "www.apple.com") // could be any website, Just to check connectivity
private var serviceURL: NSURL?
// MARK: - init & deinit methods
init(baseURL: NSURL,
configuration: NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration(),
delegate: SessionDelegate = SessionDelegate(),
serverTrustPolicyManager: ServerTrustPolicyManager? = nil) {
super.init(configuration: configuration, delegate: delegate, serverTrustPolicyManager: serverTrustPolicyManager)
var aURL = baseURL
// Ensure terminal slash for baseURL path, so that NSURL relativeToURL works as expected
if aURL.path?.characters.count > 0 && !aURL.absoluteString.hasSuffix("/") {
aURL = baseURL.URLByAppendingPathComponent("")
}
serviceURL = baseURL
NetworkActivityIndicatorManager.sharedManager.isEnabled = true
observeNetworkStatus()
}
// MARK: - Public methods
func serverRequest(methodName: String, parameters: [String : AnyObject]? , isPostRequest: Bool, headers: [String : String]?, completionBlock: TSAPIClientCompletionBlock) -> Request {
let url = NSURL(string: methodName, relativeToURL: serviceURL)
print("\(url)")
let request = self.request(isPostRequest ? .POST : .GET, url!, parameters: parameters, encoding: isPostRequest ? .JSON : .URL, headers: headers)
.validate(statusCode: 200..<600)
.responseJSON { response in
switch response.result {
case .Success:
completionBlock(response: response.response, result: response.result.value, error: nil
)
break
case .Failure(let error):
completionBlock(response: response.response, result: nil, error: error)
break
}
}
return request
}
func cancelAllRequests() {
session.getAllTasksWithCompletionHandler { tasks in
for task in tasks {
task.cancel()
}
}
}
// this will contiously observe network changes
func observeNetworkStatus() {
manager?.listener = { status in
print("Network Status Changed: \(status)")
if status == .NotReachable {
} else if status == .Unknown {
} else {
// status is reachable
// posting a notification for network connectivity NSNotificationCenter.defaultCenter().postNotificationName(kNetworkStatusConnectedNotification, object: nil)
}
}
manager?.startListening()
}
// If you want to check network manually for Example before pushing a viewController.
func isNetworkReachable() -> Bool {
return manager?.isReachable ?? false
}
}kNetworkStatusConnectedNotification是一个常量,声明如下
let kNetworkStatusConnectedNotification = "kNetworkStatusConnectedNotification"现在,如果您想观察应用程序中的网络更改,请按以下方式在该viewController中注册通知
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(HomeViewController.applicationIsConnectedToNetwok), name: kNetworkStatusConnectedNotification, object: nil)在选择器中,当你获得网络连接时,做你想做的任何事情。
func applicationIsConnectedToNetwok() {
// e.g LoadData
}我已经在我的会话类中编写了这个方法,并且我使用它来检查连通性。
func isNetworkReachable() -> Bool {
return YourAPIClient.sharedClient.isNetworkReachable()
}为了您的理解,我在代码中添加了一些注释。希望能帮上忙。
https://stackoverflow.com/questions/40230192
复制相似问题