首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用Swift检测iOS应用程序中是否存在数据传输

利用Swift检测iOS应用程序中是否存在数据传输
EN

Stack Overflow用户
提问于 2016-10-25 01:56:23
回答 1查看 550关注 0票数 0

我想知道是否有人知道如何检测iOS应用程序中是否存在数据传输。我正在使用Swift Reachability库来检测是否存在wifi或蜂窝连接,但这并不让我知道是否有实际的数据正在传输。

我的应用程序从WKWebView开始,在没有数据传输的情况下,加载占据整个屏幕的user视图,我想向用户展示一个alertController。

可达性让我知道是否有一个连接到无线或蜂窝网络,但他们没有帮助让我知道是否有任何数据正在传输。我正在用wifi进行测试,但是没有网络连接,而且我无法显示任何alertController,因为连接总是为isReachable()传递true。

有人知道怎么做吗?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-27 04:30:49

Alamofire提供了检查网络状态的功能。因此,这里详细介绍了一些其他功能。

我在我的项目中创建了一个APIClient管理器类。

代码语言:javascript
复制
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是一个常量,声明如下

代码语言:javascript
复制
let kNetworkStatusConnectedNotification = "kNetworkStatusConnectedNotification"

现在,如果您想观察应用程序中的网络更改,请按以下方式在该viewController中注册通知

代码语言:javascript
复制
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(HomeViewController.applicationIsConnectedToNetwok), name: kNetworkStatusConnectedNotification, object: nil)

在选择器中,当你获得网络连接时,做你想做的任何事情。

代码语言:javascript
复制
func applicationIsConnectedToNetwok() {
// e.g LoadData 
}

我已经在我的会话类中编写了这个方法,并且我使用它来检查连通性。

代码语言:javascript
复制
func isNetworkReachable() -> Bool {
    return YourAPIClient.sharedClient.isNetworkReachable()
}

为了您的理解,我在代码中添加了一些注释。希望能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40230192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档