我一直在研究斯坦福iPhone编码课程,目前正在使用Twitter API.我想要做的是准确处理两个错误条件:一个用于用户名无效,另一个用于当设备当前未连接到互联网时.不幸的是,就目前而言,我能猜测的最好的是API的回报是否为零 - 这两种情况都是如此.
我正在寻找的是一行或两行代码,可以在尝试任何远程数据获取之前检查连接.我可以筛选Apple文档,但我想:为什么不把这个问题提交给你们,为了我的利益,也许是其他人的利益?
附加信息:在XCode中使用Objective-C和iPhone SDK.
看看Apple的示例代码.Reachability项目显示了如何检测连接.
http://developer.apple.com/iphone/library/samplecode/Reachability/index.html
您需要读入错误代码并尽可能做出回应.我已经受够了这一些经验本质上,它可能取决于你所用,但与delicious.com交互服务,我得到错误-1012坏用户/ passwd文件其中,如果你看看它是
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
该代码有效,但并不总能创建所需的结果.
iPhone上的TCP堆栈的工作方式与预期的非常不同.使用"可达性"代码,有时会出现网络连接,但无法可靠地检测到.但是,启动MobileSafari然后重新尝试检查与"可达性"代码的连接将导致正确的结果.
我发现在确定网络连接方面最有效的方法是在应用程序加载时在单独的线程中运行NSURLConnection检查.调用一个你知道会返回"是"的URL(即服务器上的HTML文件或其他东西).然后检查以确保返回的结果等于静态文本.这样,你知道NSURLConnection堆栈正确地伸出,而不是"可达性"代码不能很好地协调工作.
这对我有用,取自苹果地震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; }