代码之家  ›  专栏  ›  技术社区  ›  lewsid

在目标C中检查互联网连接

  •  16
  • lewsid  · 技术社区  · 17 年前

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

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

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

    8 回复  |  直到 14 年前
        1
  •  30
  •   August    17 年前

    看看苹果的示例代码。Reachability项目展示了如何检测连接。

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

        2
  •  9
  •   Jason    17 年前

    这段代码可以工作,但并不总是能产生预期的结果。

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

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

        3
  •  9
  •   Nightfirecat peSHIr    14 年前

    你需要读取错误代码,并尽可能地做出回应。我对此有一些经验,基本上这可能取决于你正在与什么服务交互,但在delicious.com上,我收到错误-1012,表示用户/密码错误,如果你查一下,会发现

    NSURLErrorUserCancelledAuthentication =     -1012,
    

    尽管很明显,这种措辞具有误导性,但我可以始终如一地复制输入错误的user/passwd并得到错误代码。从技术上讲,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

        4
  •  8
  •   Raj    17 年前

    这对我来说是可行的,取自苹果地震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;
    }
    
        5
  •  3
  •   seggy    9 年前

    可达性是一个单独的类,通过你可以访问代码

       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:
        {
        }
    }
    
        6
  •  2
  •   Noah Witherspoon    17 年前

    您当前的连接代码是什么样子的?如果你正在使用 NSURLConnection +sendSynchronousRequest:returningResponse:error: ,那么您只需传递NSError变量的地址,然后进行检查;具有 connectionWithRequest:delegate: ,你应该实施 -connection:didFailWithError: 在代表中。

        7
  •  2
  •   borisdiakur Faheel Khan    15 年前

    使用Apple的可达性时,请记住,即使您尝试访问google.com或Apple.com等主机(可能是缓存问题),您也可能发现自己通过WWAN(可达ViaWWAN)或WiFi(可达ViaWiFi)连接,而没有连接到互联网。我最后打电话给自己的服务器,得到了一个数字——至少对我来说是最好的解决方案。

        8
  •  2
  •   Stephan    13 年前
    -(BOOL)returnInternetConnectionStatus{
        ReachabilityLattest *reach = [ReachabilityLattest reachabilityForInternetConnection];
        NetworkStatus internetStatus = [reach currentReachabilityStatus];
        if ((internetStatus != NotReachable)) {
            return TRUE;
        } else {
            return FALSE;
        }
    }