确定iPhone上的互联网可用性?

时间:2009-04-12 01:49:03

标签: iphone objective-c

我在iPhone应用程序中使用NSURLConnection:

NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest: request delegate: self];

请求已设置且工作正常,但我希望能够在没有可用连接的情况下向用户提供“连接不可用”消息。有没有快速的方法来确定iPhone上是否有可用的Internet连接?

在启动NSURLConnection后添加以下内容非常简单:

if (conn) { // do normal processing } else { // display connection not available message }

提前致谢, 本

2 个答案:

答案 0 :(得分:5)

这对我有用,取自苹果地震xml项目:

- (BOOL)isDataSourceAvailable
{
    static BOOL checkNetwork = YES;
    if (checkNetwork) { // Since checking the reachability of a host can be expensive, cache the result and perform the reachability check once.
        checkNetwork = NO;

        Boolean success;    
        const char *host_name = "twitter.com"; // your data source host name

        SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, host_name);
        SCNetworkReachabilityFlags flags;
        success = SCNetworkReachabilityGetFlags(reachability, &flags);
        _isDataSourceAvailable = success && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired);
        CFRelease(reachability);
    }
    return _isDataSourceAvailable;
}

答案 1 :(得分:1)

Raj,该代码有效,但并不总能创建所需的结果。

iPhone上的TCP堆栈的工作方式与预期的完全不同。使用“可达性”代码,有时会出现网络连接,但无法可靠地检测到。但是,启动MobileSafari然后重新尝试检查与“可达性”代码(Raj的代码)的连接将导致正确的结果。

我发现在确定网络连接方面最有效的方法是在应用程序加载时,在单独的线程中运行NSURLConnection检查。拨打一个您知道会返回“是”的URL(即服务器上的HTML文件或其他内容)。然后检查以确保返回的结果等于静态文本。这样,您就知道NSURLConnection堆栈正在正确地伸出,而不是“可达性”代码不能完全一致地工作。