在Objective C中检查Internet连接

时间:2009-01-25 15:53:13

标签: objective-c ios twitter

我一直在研究斯坦福iPhone编码课程,目前正在使用Twitter API。我想要做的是准确处理两个错误条件:一个用于用户名无效,另一个用于当设备当前未连接到互联网时。不幸的是,就目前而言,我能猜测的最好的是API的回报是否为零 - 这两种情况都属于这种情况。

我正在寻找的是一行或两行代码,可以在尝试任何远程数据提取之前检查连接。我可以通过Apple文档进行筛选,但我想:为什么不把这个问题提交给你们,为了我的利益,也许是其他人的问题?

其他信息:在XCode中使用Objective-C和iPhone SDK。

8 个答案:

答案 0 :(得分:30)

看看Apple的示例代码。 Reachability项目显示了如何检测连接。

http://developer.apple.com/iphone/library/samplecode/Reachability/index.html

答案 1 :(得分:9)

您需要阅读错误代码并尽可能做出回应。我有一些经验,基本上它可能取决于你正在与哪些服务进行交互,但是对于Delicious.com,我会收到错误的-1012错误的用户/密码,如果你查找它是

NSURLErrorUserCancelledAuthentication =     -1012,
虽然显然措辞有误导性,但我可以不断地复制输入错误的用户/密码并获取错误代码。从技术上讲,iPhone永远不会连接到互联网,除非你在一些有数据连接问题的奇怪地区。我也看到有错误代码

NSURLErrorNotConnectedToInternet =      -1009,

我会通过NSURLError.h(还有更多类似的内容)

NSURLErrorUnsupportedURL =          -1002,
NSURLErrorCannotFindHost =          -1003,
NSURLErrorCannotConnectToHost =         -1004,
NSURLErrorNetworkConnectionLost =       -1005,

等...

您需要做的就是获取对传入的NSError对象的引用。检查它的错误代码是这样的

//NSError *returnedError

if([returnedError code] == kERROR_CODE_BAD_USERNAME_OR_PASSWORD)

常量是我在自己的源代码中定义的,基本上是-1012

答案 2 :(得分:9)

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

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

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

答案 3 :(得分:8)

这对我有用,取自苹果地震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;
}

答案 4 :(得分:3)

可访问性是单独的类,您可以访问代码

   Reachability *curReach = [Reachability reachabilityForInternetConnection];
NetworkStatus netStatus = [curReach currentReachabilityStatus];
switch (netStatus)
{
    case NotReachable:
    {
        UIAlertView *connectionAlert = [[UIAlertView alloc] init];
        [connectionAlert setTitle:@"Error"];
        [connectionAlert setMessage:@"Please check your network connection."];
        [connectionAlert setDelegate:self];
        [connectionAlert setTag:1];
        [connectionAlert addButtonWithTitle:@"Back"];
        [connectionAlert show];

        break;
    }
    case ReachableViaWWAN:
    {


    }
    case ReachableViaWiFi:
    {
    }
}

答案 5 :(得分:2)

您目前的连接代码是什么样的?如果您正在使用NSURLConnection +sendSynchronousRequest:returningResponse:error:,那么您只需要传递NSError变量的地址并在此后检查;使用connectionWithRequest:delegate:,您应该在代理中实施-connection:didFailWithError:

答案 6 :(得分:2)

使用Apple的Reachability时,请注意,即使您尝试访问某些主机(如google.com或apple.com),您也可以通过WWAN(ReachableViaWWAN)或WiFi(ReachableViaWiFi)连接而无需连接到互联网。也许是一个缓存问题)。我最后打电话给我自己的服务器并取回一个数字 - 至少在我的情况下是最好的解决方案。

答案 7 :(得分:2)

-(BOOL)returnInternetConnectionStatus{
    ReachabilityLattest *reach = [ReachabilityLattest reachabilityForInternetConnection];
    NetworkStatus internetStatus = [reach currentReachabilityStatus];
    if ((internetStatus != NotReachable)) {
        return TRUE;
    } else {
        return FALSE;
    }
}