Macos 检查cocoa应用程序中的internet连接

Macos 检查cocoa应用程序中的internet连接,macos,cocoa,connection,Macos,Cocoa,Connection,如何在OS X cocoa应用程序中检查internet连接? 苹果的iOS可访问性示例代码是否可以重用 谢谢 Nava此代码将帮助您查找是否可以访问internet: -(BOOL)isInternetAvail { BOOL bRet = FALSE; const char *hostName = [@"google.com" cStringUsingEncoding:NSASCIIStringEncoding]; SCNetworkConnectionFlags f

如何在OS X cocoa应用程序中检查internet连接? 苹果的iOS可访问性示例代码是否可以重用

谢谢


Nava

此代码将帮助您查找是否可以访问internet:

-(BOOL)isInternetAvail
{
    BOOL bRet = FALSE;
    const char *hostName = [@"google.com" cStringUsingEncoding:NSASCIIStringEncoding];
    SCNetworkConnectionFlags flags = 0;

    if (SCNetworkCheckReachabilityByName(hostName, &flags) && flags > 0) 
    {
        if (flags == kSCNetworkFlagsReachable)
        {
            bRet = TRUE;
        }
        else
        {
        }
    }
    else 
    {
    }
    return bRet;
}

要了解更多信息,您可以查看

苹果有一个很好的代码,它可以为您实现这一点。您可以检查您的连接是否为Instance的WiFi或仅为cell/WiFi。

苹果网站上列出的、上面引用的当前版本的可达性代码(2.2)并不像Mac OS X Cocoa应用程序那样编译。常量kSCNetworkReachabilityFlagsIsWWAN仅在为TARGET_OS_IPHONE编译时可用,Reachability.m引用该常量。您需要#ifdef Reachability.m中引用它的两个位置,如下所示:

#if TARGET_OS_IPHONE
      (flags & kSCNetworkReachabilityFlagsIsWWAN)               ? 'W' : '-',
#else
      0,
#endif


Unicorn的解决方案已被弃用,但您可以使用以下代码获得相同的结果:

SCNetworkReachabilityRef target;

SCNetworkConnectionFlags flags = 0;

Boolean ok;

target = SCNetworkReachabilityCreateWithName(NULL, hostName);

ok = SCNetworkReachabilityGetFlags(target, &flags);

CFRelease(target);

我知道这是一个古老的线程,但对于2018年遇到这个问题的人来说,有一个更简单、更快的解决方案,使用
进程
ping
命令

Swift 4示例:

func ping(_ host: String) -> Int32 {
    let process = Process.launchedProcess(launchPath: "/sbin/ping", arguments: ["-c1", host])
    process.waitUntilExit()
    return process.terminationStatus
}

let internetAvailable = ping("google.com") == 0
print("internetAvailable \(internetAvailable)")

这对可可有用。对于iphone,您可能需要根据SDK文档替换标志和方法名称。此函数已被弃用,请参阅我的答案以了解Apple提出的等效解决方案。是的,我使用此选项检查iphone的连接。我的问题是,它是否适用于常规的cocoa应用程序:运行时要求:Mac OS X 10.5.3、iPhone OS 3.0,所以我的猜测是肯定的。此链接中的示例仅适用于iOS。这不会在OSX中编译。如果你查看代码,就会发现到处都是“UITextFields”和其他“UI”stuf。正如@dbainbridge在你的文章中解释的那样,“可达性”类也不能工作。这需要什么框架?我无法在我的应用程序中仅使用我的应用程序中包含的Cocoa和WebKit框架来编译它。一旦获得标志:在我的Mac上,即使机场关闭且没有直接连接,“可达性”标志本身也没有任何意义。似乎有效的方法是:对于WiFi,检查是否
(flags&kSCNetworkReachabilityFlagsIsDirect)
。对于插入式Internet连接,请检查
(flags&kSCNetworkReachabilityFlagsIsLocalAddress)
。此外,当根本没有连接时,
kscnetworkreachaabilityFlagsTranssientConnection
kscnetworkreachaabilityFlagsConnectionRequired
的标志会出现。这不是一个特别好的解决方案,这就是为什么我将其作为注释而不是答案列出的原因,但是,如果您设置
WebView
frameLoadDelegate
,则当发生
临时加载错误时,它将收到该错误,如果没有web连接,该错误将立即发生。由于我使用的是
WebView
(来自
WebKit.framework
),所以我只是在它收到
临时加载错误后立即抛出一条错误消息。这正是我所看到的for@dbainbridge您想要的是
'-',
,而不是上面的
0,
func ping(_ host: String) -> Int32 {
    let process = Process.launchedProcess(launchPath: "/sbin/ping", arguments: ["-c1", host])
    process.waitUntilExit()
    return process.terminationStatus
}

let internetAvailable = ping("google.com") == 0
print("internetAvailable \(internetAvailable)")