我该如何在OS X Cocoa应用程序中检查互联网连接?是否可以重用苹果的iOS可达性示例代码来实现此目的?
谢谢,
Nava
我该如何在OS X Cocoa应用程序中检查互联网连接?是否可以重用苹果的iOS可达性示例代码来实现此目的?
谢谢,
Nava
目前在苹果网站上列出的 Reachability 代码(2.2版),并且上面提到的代码不能直接在 Mac OS X Cocoa 应用程序中编译。常量 kSCNetworkReachabilityFlagsIsWWAN 只有在编译 TARGET_OS_IPHONE 时才可用,而 Reachability.m 引用了该常量。您需要对 Reachability.m 中引用该常量的两个位置进行 #ifdef 操作,如下所示:
#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
'-'
而不是0
。 - craig65535这段代码将帮助你判断互联网是否可达:
-(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可达性
独角兽的解决方案已经过时,但您可以使用以下代码获得等效的结果:
SCNetworkReachabilityRef target;
SCNetworkConnectionFlags flags = 0;
Boolean ok;
target = SCNetworkReachabilityCreateWithName(NULL, hostName);
ok = SCNetworkReachabilityGetFlags(target, &flags);
CFRelease(target);
(flags & kSCNetworkReachabilityFlagsIsDirect)
。对于插入式互联网连接,请检查(flags & kSCNetworkReachabilityFlagsIsLocalAddress)
。此外,当根本没有连接时,kSCNetworkReachabilityFlagsTransientConnection
和kSCNetworkReachabilityFlagsConnectionRequired
的标识会显示出来。 - Wienke苹果有一个很好的代码可以为您完成此操作。您可以检查您的连接是WiFi还是仅限于手机/WiFi。 链接文本
我知道这是一个旧的帖子,但对于在2018年遇到此问题的任何人,使用Process
和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)")
WebView
的frameLoadDelegate
,它将在出现provisionalLoadError
时接收到通知,如果没有网络连接,这几乎是立即发生的。由于我已经在使用WebView
(来自WebKit.framework
),所以只要它收到provisionalLoadError
,我就会立即弹出错误消息。 - ArtOfWarfare