2016-10-25 32 views
0

我想知道是否有人知道如何檢測iOS應用程序中是否存在數據傳輸。我正在使用Swift Reachability庫來檢測是否有wifi或蜂窩連接,但是這並不讓我知道是否有實際的數據正在傳輸。檢測iOS應用程序中是否存在數據傳輸Swift

我的應用程序從一個WKWebView開始,並且在沒有數據傳輸的情況下加載佔用整個屏幕的webview,我想向用戶展示一個alertController。

可達性讓我知道是否有連接到WiFi或蜂窩網絡,但他們不幫助讓我知道是否有任何數據傳輸。我正在使用無線網絡進行測試,但沒有網絡連接,而且我無法顯示任何alertController,因爲連接總是通過isReachable()傳遞。

有誰知道如何去做這件事?謝謝。

+0

如果我得到這個權利。你基本上想知道互聯網連接的確切狀態嗎?如果您使用alamofire來獲取資源,可以通過Alamofire完成。 –

+0

因爲這個,我正在尋找Alamofire,但我沒有獲取任何類型的JSON,我正在加載一個webview。有沒有一種方法可以讓我測試以查看是否可以使用Alamofire獲取網站,如果是,請加載webview? –

+0

通過alamofire,您可以簡單地檢查互聯網是否可用,無論是無線網絡還是蜂窩網絡。如果你想 –

回答

0

Alamofire提供功能來檢查網絡狀態。所以這裏詳細介紹一些其他功能。

我在我的項目中創建了APIClient Manager類。

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 
} 

我在會話類寫了這個方法,我用它來檢查連接在您的理解代碼mannualy

func isNetworkReachable() -> Bool { 
    return YourAPIClient.sharedClient.isNetworkReachable() 
} 

我增加了一些意見。我希望它有幫助。

+0

謝謝您的分享,Umair。我很感謝你幫助我的時間。所以我一直在閱讀你的代碼,並試圖更好地理解如何去檢查數據連接,但是我仍然不確定你將如何在代碼中使用這個類。你介意分享你如何在視圖控制器中使用它? –

+0

你的代碼的確幫我解決了如何修復我的解決方案:)謝謝你,Umair! –

+0

你得到它的工作請接受或upvote如果它幫助你的答案。 –

相關問題