【问题标题】:Checking For Internet Connectivity in Objective C在 Objective C 中检查 Internet 连接
【发布时间】:2010-10-03 10:24:13
【问题描述】:

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

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

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

【问题讨论】:

    标签: objective-c ios twitter


    【解决方案1】:

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

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

    【讨论】:

    • 只是想说,我发现 Reachability 类对我的工作非常有帮助。再次感谢。
    • 我希望 iOS 7 可以使用 Reachability。上面的链接说,构建要求:iOS SDK 8.0 或更高版本;运行时要求:iOS 8.0 或更高版本
    【解决方案2】:

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

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

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

    【讨论】:

    • 使用这种方法,我们无法检测到何时失去连接。在使用可达性时,我们会在失去/获得连接时收到通知
    【解决方案3】:

    您需要阅读错误代码并尽可能做出响应。我在这方面有过一些经验,这可能取决于您正在与之交互的服务,但是对于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

    【讨论】:

    • 如果 ([returnedError code] == NSURLErrorUserCancelledAuthentication) 为什么不呢?
    • 你也可以那样做,不管对你有用。我这样做是因为当您编写代码以检查错误的用户/密码凭据时,“UserCancelledAuthentication”的措辞会产生误导和混淆,BAD_USERNAME_OR_PASSWORD 比“UserCancelledAuthentication”读起来要好得多
    【解决方案4】:

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

    【讨论】:

    • 效果很好。需要在顶部初始化 _isDataSourceAvailable=NO。
    【解决方案5】:

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

       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】:

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

    【讨论】:

    【解决方案7】:

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

    【讨论】:

      【解决方案8】:
      -(BOOL)returnInternetConnectionStatus{
          ReachabilityLattest *reach = [ReachabilityLattest reachabilityForInternetConnection];
          NetworkStatus internetStatus = [reach currentReachabilityStatus];
          if ((internetStatus != NotReachable)) {
              return TRUE;
          } else {
              return FALSE;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-31
        • 2019-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-15
        相关资源
        最近更新 更多