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

Posted

技术标签:

【中文标题】Cocoa:确定唤醒时的网络可用性【英文标题】:Cocoa: determine network availability on wake 【发布时间】:2015-08-05 12:15:27 【问题描述】:

我正在编写一个 Cocoa OS X 应用程序,该应用程序需要根据系统从睡眠中唤醒时是否存在互联网连接来执行不同的操作。我使用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(例如,当我到达我的大学时),上面的代码会检测到当笔记本电脑在新位置从睡眠中唤醒时,no 互联网可访问性 -尽管实际上有一个已知的 WiFi 可用。

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

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

有没有办法在网络适配器(有线和无线)完成连接尝试时收到通知?

【问题讨论】:

【参考方案1】:

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

对于互联网可访问性,我使用下面的代码,它在 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.com,这意味着我已经连接到某个网络!但如果不是,我不是!

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

【讨论】:

感谢您的回答。我想你误解了我的问题。我不是在问如何检查互联网连接——这部分已经使用可达性 API 工作得很好。我的问题是当计算机从睡眠中唤醒时何时检查互联网连接。这是有问题的,因为当收到唤醒通知时,连接可能仍在建立过程中。 也许你可以检查很多时间

以上是关于Cocoa:确定唤醒时的网络可用性的主要内容,如果未能解决你的问题,请参考以下文章

Swift互用性:采用Cocoa设计模式(Swift 2.0版)-b

Swift互用性:与 Cocoa 数据类型共舞(Swift 2.0版)-b

没有可用 Internet 连接时的 CLGeocoder reverseGeocodeLocation 结果

win7网络连接不可用出现红叉怎么办

怎么用ping命令测试服务器网络连通性

Swift中使用Cocoa数据类型,有哪些操作?