2016-02-02 26 views
0

每個人都閱讀它! 我的iOS程序需要連接到互聯網,如果連接丟失,請立即向我報告。它可以是任何東西:飛行模式,改變從LTE到3G或Edge的模式,打開或關閉WiFi,從WiFi到蜂窩信號或相反。我已經有了一個代碼,它允許檢查Internet是否可用。在那裏,它是(從How to use SCNetworkReachability in Swift):iPhone - 捕捉系統事件,如果Internet可用或不可用

import SystemConfiguration 

    func connectedToNetwork() -> 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) { 
      return false 
     } 
     let isReachable = flags.contains(.Reachable) 
     let needsConnection = flags.contains(.ConnectionRequired) 
     return (isReachable && !needsConnection) 
    } 

但此代碼的工作只是如果我叫connectedToNetwork()函數。例如,當我將POST請求發送到服務器或按下按鈕時。我可以使用計時器每10秒執行一次該代碼,但我認爲必須有更好的方法。所以我想捕捉系統事件,如果有連接發生,然後執行此代碼或獲取有關Internet的信息已丟失或可用。感謝您的未來幫助!

+0

您的代碼似乎是從http://stackoverflow.com/questions/25623272/how-to-use-scnetworkreachability-in-swift/25623647#25623647。如果您查看答案的結尾,則可以找到有關如何註冊在網絡更改中調用的回調函數的更多信息的鏈接。 –

+0

是的,馬丁,那是代碼。但是,你能改善你的答案以解釋如何通過NSNotification或觀察者來使用它嗎? – Alex

+0

我需要強制它通過NSNotification中心工作。據我所知,我正在添加觀察員,然後捕捉它的回覆。 – Alex

回答

0

好吧,我發現了一個簡單的答案:

1)創建文件.swift並粘貼有:

import Foundation 
import SystemConfiguration 

var internetAvailable: Bool = true 

let ReachabilityStatusChangedNotification = "ReachabilityStatusChangedNotification" 

func isInternetAvailable() { 
    let hostToConnect = "google.com" 
    var context = SCNetworkReachabilityContext(version: 0, info: nil, retain: nil, release: nil, copyDescription: nil) 
    let isAvailable = SCNetworkReachabilityCreateWithName(nil, hostToConnect)! 

    SCNetworkReachabilitySetCallback(isAvailable, { (_, flags, _) in 
     var reachabilityFlags = SCNetworkReachabilityFlags() 
     reachabilityFlags = flags 

     if (reachabilityFlags.contains(.Reachable)) && !(reachabilityFlags.contains(.ConnectionRequired)) { 
      if reachabilityFlags.contains(.IsWWAN) { 
       internetAvailable = true 
       print("Online Cellular") 
      } else { 
       internetAvailable = true 
       print("Online WiFi") 
      } 
     } else { 
      internetAvailable = false 
      print("Offline") 
     } 

     NSNotificationCenter.defaultCenter().postNotificationName(ReachabilityStatusChangedNotification, object: nil) 

     }, &context) 

    SCNetworkReachabilityScheduleWithRunLoop(isAvailable, CFRunLoopGetMain(), kCFRunLoopCommonModes) 
} 

2)在AppDelegate.swift發現功能應用和替換它或添加它:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
     // Override point for customization after application launch. 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("networkStatusChanged:"), name: ReachabilityStatusChangedNotification, object: nil) 
     isInternetAvailable() 
     return true 
    } 

3)在AppDelegate.swift中也添加此功能:

func networkStatusChanged(notification: NSNotification) { 
    } 

4)完成!功能networkStatusChanged將在網絡連接發生任何變化時執行!如果你需要的東西做的,需要互聯網做這樣的:

if internetAvailable { 
//Do what you need, for example send JSON request on server 
} 
0

當網絡狀態發生變化時,您可以使用Reachability類來獲取通知。有關文檔以及集成可達性的示例代碼,請參閱https://developer.apple.com/library/ios/samplecode/Reachability/Introduction/Intro.html。它會爲您提供kReachabilityChangedNotification通知,當網絡狀態發生變化時廣播通知。一旦你收到通知,你可以檢查網絡是否可用。上面的鏈接也提供了示例項目演示如何使用Reachability

UPDATE的

參考Detecting Network Connectivity Changes using Reachability, NSNotification and Network Link Conditioner in Swift代碼如何實現它。

UPDATE 目前Reachability類是僅適用於客觀C.所以,你可以參考這個How to call Objective-C code from Swift在SWIFT項目中使用目標C代碼。

+0

謝謝你的回答。有沒有可能看到任何沒有硬代碼的例子呢? – Alex

+0

請檢查編輯 –

+0

謝謝,但它差不多。這些例子中的人使用.h和.m文件。這不是純粹的快速,我需要迅速的解決方案... – Alex

0

您應該使用Reachability模塊。這給出驚人的回調和實時檢測網絡狀態和變化。

https://github.com/ashleymills/Reachability.swift

+0

謝謝你的回答,但我還沒有準備好使用GitHub的模塊,因爲它們通常太難而且功能太強大。我只需要簡單的代碼示例... – Alex