15

我一直在学习斯坦福 iPhone 编码课程,目前正在使用 Twitter API。我想做的是准确处理两种错误情况:一种是用户名无效,另一种是设备当前未连接到互联网。不幸的是,就目前而言,我能推测的最好的结果是 API 的返回是否为零 - 这两种情况都是如此。

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

附加信息:在 XCode 中使用 Objective-C 和 iPhone SDK。

4

8 回答 8

30

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

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

于 2009-01-25T16:35:34.887 回答
9

您需要阅读错误代码并尽可能做出响应。我在这方面有一些经验,这可能取决于您正在与之交互的服务,但是对于delicious.com,我收到错误用户/密码错误-1012,如果您查找它是

NSURLErrorUserCancelledAuthentication =     -1012,

尽管显然该措辞具有误导性,但我可以始终如一地复制输入错误的用户/密码并获取该错误代码。从技术上讲,iPhone 永远不会没有连接到互联网,除非你在某个奇怪的地区,数据连接有问题。我也看到有错误代码

NSURLErrorNotConnectedToInternet =      -1009,

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

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

ETC...

您需要做的就是获取对您传入的 NSError 对象的引用并检查它的错误代码,如下所示

//NSError *returnedError

if([returnedError code] == kERROR_CODE_BAD_USERNAME_OR_PASSWORD)

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

于 2009-01-25T16:31:53.940 回答
9

该代码有效,但并不总是产生所需的结果。

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

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

于 2009-05-10T04:45:50.337 回答
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;
}
于 2009-03-26T15:18:22.390 回答
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:
    {
    }
}
于 2013-08-20T05:40:47.710 回答
2

您当前的连接代码是什么样的?如果你正在使用NSURLConnection +sendSynchronousRequest:returningResponse:error:,那么你只需要传递一个 NSError 变量的地址,然后检查它;,connectionWithRequest:delegate:您应该-connection:didFailWithError:在委托中实现。

于 2009-01-25T15:59:05.957 回答
2

使用 Apple 的 Reachability 时请记住,即使您尝试访问 google.com 或 apple.com 之类的主机(可能是缓存问题)。我最终打电话给我自己的服务器并取回了一个数字——至少在我的情况下是最好的解决方案。

于 2011-05-18T10:40:56.467 回答
2
-(BOOL)returnInternetConnectionStatus{
    ReachabilityLattest *reach = [ReachabilityLattest reachabilityForInternetConnection];
    NetworkStatus internetStatus = [reach currentReachabilityStatus];
    if ((internetStatus != NotReachable)) {
        return TRUE;
    } else {
        return FALSE;
    }
}
于 2012-08-14T06:40:38.223 回答