检查可可应用程序中的互联网连接

发布于 2024-09-04 11:32:27 字数 99 浏览 2 评论 0 原文

如何在 OS X cocoa 应用程序中检查互联网连接? Apple 的 iOS Reachability 示例代码可以重复用于此目的吗?

谢谢,

纳瓦

How do I check internet connection in an OS X cocoa application?
Can Apple's iOS Reachability example code be reused for this purpose?

Thanks,

Nava

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

自控 2024-09-11 11:32:27

Apple 网站上列出的和上面引用的当前版本的 Reachability 代码 (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

#if TARGET_OS_IPHONE
if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
{
    // ... but WWAN connections are OK if the calling application
    //     is using the CFNetwork (CFSocketStream?) APIs.
    retVal = ReachableViaWWAN;
}
#endif

The current version of Reachability code (2.2) listed on Apple's site and referenced above does NOT compile as-is for a Mac OS X Cocoa application. The constant kSCNetworkReachabilityFlagsIsWWAN is only available when compiling for TARGET_OS_IPHONE and Reachability.m references that constant. You will need to #ifdef the two locations in Reachability.m that reference it like below:

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

and

#if TARGET_OS_IPHONE
if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
{
    // ... but WWAN connections are OK if the calling application
    //     is using the CFNetwork (CFSocketStream?) APIs.
    retVal = ReachableViaWWAN;
}
#endif
书信已泛黄 2024-09-11 11:32:27

此代码将帮助您确定互联网是否可达:

-(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;
}

有关详细信息,您可以查看 iPhone 可达性

This code will help you to find if internet is reachable or not:

-(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;
}

For more information you can look at the iphone-reachability

好菇凉咱不稀罕他 2024-09-11 11:32:27

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

SCNetworkReachabilityRef target;

SCNetworkConnectionFlags flags = 0;

Boolean ok;

target = SCNetworkReachabilityCreateWithName(NULL, hostName);

ok = SCNetworkReachabilityGetFlags(target, &flags);

CFRelease(target);

Unicorn's solution is deprecated, but you can get equivalent results using the following code:

SCNetworkReachabilityRef target;

SCNetworkConnectionFlags flags = 0;

Boolean ok;

target = SCNetworkReachabilityCreateWithName(NULL, hostName);

ok = SCNetworkReachabilityGetFlags(target, &flags);

CFRelease(target);
走走停停 2024-09-11 11:32:27

苹果有一个很好的代码可以为你做到这一点。您可以检查您的连接是否是 WiFi,或者只是手机/WiFi。
链接文本

Apple has a nice code which does it for you. You can check if your connection is WiFi for instnace or just cell/WiFi.
link text

望她远 2024-09-11 11:32:27

我知道这是一个旧线程,但对于 2018 年遇到此问题的任何人来说,有一个使用 Processping 命令的更简单、更快的解决方案。

斯威夫特 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)")

I know this is an old thread but for anyone running into this in 2018, there's an simpler and quicker solution using a Process and the ping command.

Swift 4 example:

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)")
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文