检查目标C中的Internet连接

我一直在通过斯坦福iPhone编码课程,目前正在接入Twitter API。 我想要做的是精确处理两个错误条件:一个用于用户名无效,另一个用于设备当前没有连接到互联网。 不幸的是,现在我可以推测的最好的是API的返还是否为零 – 两种情况都是如此。

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

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

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

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

该代码的作品,但并不总是创造所需的结果。

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

我发现在确定networking连接性方面最有效的方法是在应用程序加载时在单独的线程中运行NSURLConnection检查。 拨打一个你知道会返回类似“是”(即你的服务器上的HTML文件或某物)的URL的电话。 然后检查以确保返回的结果等于静态文本。 这样,你就知道NSURLConnection堆栈是正确的,而不是一致的“可达性”代码。

您需要阅读错误代码并尽可能地做出回应。 我已经有了一些经验,这基本上可能取决于你正在与什么服务交互,但与delicious.com我得到错误-1012坏用户/密码,如果你看它是

NSURLErrorUserCancelledAuthentication = -1012, 

虽然清楚的是,措辞是误导性的,虽然我可以一贯复制不良的用户/ 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

这对我的作品,是从苹果地震的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; } 

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

  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: { } } 

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

当使用苹果的可达性熊记住,你可以发现自己通过WWAN(ReachableViaWWAN)或WiFi(ReachableViaWiFi)连接而不需要连接到互联网,即使你尝试访问某些主机,如google.com或apple.com(也许是一个caching问题)。 我最终打电话给我自己的服务器,并找回一个数字 – 至less在我的情况下,最好的解决scheme。

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