如何在Cocoa中确定Internet连接?

Use*_*234 6 macos cocoa objective-c

我需要确定Internet连接是否可用.我不在乎它是如何连接的(WI-FI,Lan等......).我需要确定,是否可以使用Internet连接.

PS我找到了一种检查WI-FI连接的方法.但我不在乎它是如何连接的(我需要检查所有可以连接到Internet的方式).

像(isConnected)的东西

use*_*084 9

我希望这段代码适用于iOS和OSX平台.

#include <SystemConfiguration/SystemConfiguration.h>
static BOOL isInternetConnection()
{
    BOOL returnValue = NO;

#ifdef TARGET_OS_MAC

    struct sockaddr zeroAddress;
    bzero(&zeroAddress, sizeof(zeroAddress));
    zeroAddress.sa_len = sizeof(zeroAddress);
    zeroAddress.sa_family = AF_INET;

    SCNetworkReachabilityRef reachabilityRef = SCNetworkReachabilityCreateWithAddress(NULL, (const struct sockaddr*)&zeroAddress);


#elif TARGET_OS_IPHONE

    struct sockaddr_in address;
    size_t address_len = sizeof(address);
    memset(&address, 0, address_len);
    address.sin_len = address_len;
    address.sin_family = AF_INET;

    SCNetworkReachabilityRef reachabilityRef = SCNetworkReachabilityCreateWithAddress(NULL, (const struct sockaddr*)&address);

#endif

    if (reachabilityRef != NULL)
    {
        SCNetworkReachabilityFlags flags = 0;

        if(SCNetworkReachabilityGetFlags(reachabilityRef, &flags))
        {
            BOOL isReachable = ((flags & kSCNetworkFlagsReachable) != 0);
            BOOL connectionRequired = ((flags & kSCNetworkFlagsConnectionRequired) != 0);
            returnValue = (isReachable && !connectionRequired) ? YES : NO;
        }

        CFRelease(reachabilityRef);
    }

    return returnValue;

}
Run Code Online (Sandbox Code Playgroud)


Ale*_*lex 8

看一下SCNetworkReachability参考文献.这是一个C API,因此它不像单个方法调用那样容易使用,但是当特定地址通过网络可访问或无法访问时,它可以很好地通知您的应用程序.

大纲是你将用SCNetworkReachabilityCreateWithAddress或创建一个对象SCNetworkReachabilityCreateWithName,然后将其添加到运行循环中SCNetworkReachabilityScheduleWithRunLoop.确定可达性并且更改时,将调用您提供的回调函数.您可以使用它来更新应用程序的状态.

Apple提供了一个示例应用程序,展示了如何使用它(虽然它是为iOS设计的,而不是Mac OS X)

  • 这在Mac OS X上可用(链接的文档来自Mac OS X库).这个例子恰好是为iOS编写的.没有系统提供的`isConnected`方法.但是您可以使用它来编写自己的`isConnected`方法. (2认同)