【问题标题】:check internet connection in cocoa application检查可可应用程序中的互联网连接
【发布时间】:2010-06-08 08:40:06
【问题描述】:

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

谢谢,

纳瓦

【问题讨论】:

  • 这不是一个特别好的解决方案,这就是为什么我将其列为评论而不是答案,但如果您设置WebViewframeLoadDelegate,它'当provisionalLoadError 发生时会收到,如果没有网络连接,这几乎是立即的。因为无论如何我都在使用WebView(来自WebKit.framework),所以只要它得到provisionalLoadError,我就会抛出一条错误消息。

标签: macos cocoa connection


【解决方案1】:

Apple 网站上列出并在上面引用的当前版本的可达性代码 (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

【讨论】:

  • 这正是我想要的
  • @dbainbridge 你想要'-',,而不是上面的0,
【解决方案2】:

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

-(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-reachability

【讨论】:

  • 这适用于可可。对于 iphone,您可能已经根据 SDK 文档替换了标志和方法名称。
  • 此功能已弃用,请参阅我对 Apple 提出的等效解决方案的回答。
【解决方案3】:

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

SCNetworkReachabilityRef target;

SCNetworkConnectionFlags flags = 0;

Boolean ok;

target = SCNetworkReachabilityCreateWithName(NULL, hostName);

ok = SCNetworkReachabilityGetFlags(target, &flags);

CFRelease(target);

【讨论】:

  • 这需要什么框架?我无法仅使用我的应用程序中包含的 Cocoa 和 WebKit 框架在我的应用程序中编译它。
  • 获得标志后:在我的 Mac 上,即使机场关闭且没有直接连接,标志也会显示 kSCNetworkReachabilityFlagsReachable -- “可达性”标志本身没有任何意义 .似乎可行的是:对于 WiFi,请检查 (flags & kSCNetworkReachabilityFlagsIsDirect)。对于插入式 Internet 连接,请检查 (flags & kSCNetworkReachabilityFlagsIsLocalAddress)。此外,当根本没有连接时,kSCNetworkReachabilityFlagsTransientConnectionkSCNetworkReachabilityFlagsConnectionRequired 的标志就会出现。
【解决方案4】:

Apple 有一个很好的代码可以为你做这件事。您可以检查您的连接是用于实例的 WiFi 还是只是蜂窝/WiFi。 link text

【讨论】:

  • 是的,我正在使用它来检查 iPhone 的连接性。我的问题是它是否也适用于常规可可应用
  • developer.apple.com/iphone/library/samplecode/Reachability/… 说:运行时要求:Mac OS X 10.5.3,iPhone OS 3.0,所以我猜是的。
  • 此链接中的示例仅适用于 iOS。这不会在 OSX 中编译。如果您查看代码,则到处都是“UITextFields”和其他“UI”内容。正如@dbainbridge 在您的帖子中所解释的那样,“可达性”类也不会起作用。
【解决方案5】:

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

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)")

【讨论】:

    猜你喜欢
    • 2022-11-07
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    相关资源
    最近更新 更多