Cocoa:确定唤醒时的网络可用性

时间:2015-08-05 12:15:28

标签: macos swift cocoa reachability

我正在编写一个Cocoa OS X应用程序,需要执行不同的操作,具体取决于系统从睡眠状态唤醒时是否存在Internet连接。我使用NSWorkspace.sharedWorkspace()的通知中心接收唤醒通知,如下所示:

NSWorkspace.sharedWorkspace().notificationCenter.addObserver(self, selector: "onSystemWake:", name: NSWorkspaceDidWakeNotification, object: nil)

我的问题是onSystemWake:的实施。我使用Reachability示例代码来查询系统唤醒时是否存在互联网连接:

@objc func onSystemWake(notif: NSNotification) {
    let status = internetReachability.currentReachabilityStatus()
    if status.value == NotReachable.value {
        // Internet not reachable, do some stuff.
    } else {
        // Internet reachable, do some other stuff.
    }
}

当我在家时让我的笔记本电脑进入睡眠并再次唤醒时,这似乎工作正常。但是,如果笔记本电脑在睡眠期间切换到另一个已知的WiFi(例如,当我到达我的大学时),上面的代码会检测到笔记本电脑在新位置从睡眠状态唤醒时没有互联网可达性 - 尽管实际上已有可用的WiFi。

我认为原因是当我的应用程序收到系统唤醒通知时,网络连接仍在建立过程中。

我可以在收到系统唤醒通知后延迟我的互联网可达性检查 x 秒,但这似乎是一个非常糟糕的解决方案,因为笔记本电脑和网络的某些组合可能有更长的连接时间比其他人。

当网络适配器(有线和无线)完成连接尝试时,是否有通知的方法?

1 个答案:

答案 0 :(得分:0)

声称最好是宣称它是什么网络!因为也许你连接到一个网络网络!但它没有连接到互联网!

对于互联网可访问性我使用下面的代码,它在iOS上运行正常!

        let domain: NSURL = NSURL(string : "http://google.com/")!
    let req : NSMutableURLRequest = NSMutableURLRequest(URL: domain)
    req.HTTPMethod = "POST"
    let data = "\0"
    req.HTTPBody = data.dataUsingEncoding(NSUTF8StringEncoding)
    NSURLConnection.sendAsynchronousRequest(req, queue: NSOperationQueue.mainQueue())
        {
            (respons,data,error) in
            print(respons)
            if respons == nil
            {
\\ Internet is not Active!!
            }
            else
            {
\\ Internet is Active!!
                }
        }

以上代码说google意味着互联网!如果我可以访问google.com,这意味着我已经连接到某个网络了!但如果不是我不是!

问题是,如果您使用的网络类似于公司网络,并且网络没有为您提供互联网连接!以上代码不能满足您的需求!在这种情况下,当然取决于您的网络,您必须要求其他东西!像路由器一样!