我已经在一个iPhone应用程序上工作了几个星期了,我之前添加的一个功能是
UIWebView
加载了上下文相关的Wikipedia页面主题。这是一个非常简单的实现,并且已经很好地工作了一段时间。
今天,我发现这个功能出人意料地停止了工作。我一直在那段代码的外围摆弄,起初我以为我弄坏了什么东西。
我检查了所有明显的地方,我的网址,是
UIWebView
仍然挂在锡伯等。我没有发现任何问题。
进一步调查后,我在我的计算机上添加了一些错误处理
迪德罗
发现我收到了一个-999错误:
无误取消
在异步加载失败时返回
将创建一个Web工具包框架委托
当它执行以下操作时接收此错误:
资源请注意,NSURLConnection
取消。
因此,这听起来像是在原始请求完成之前提出新请求(或取消)。我检查我的代码是否有类似的内容,结果是空的。
string = "GET /wiki/Franklin_D._Roosevelt HTTP/1.1\r\nHost: en.wikipedia.org\r\nUser-Agent: test\r\nReferer: http://en.wikipedia.org/wiki/Franklin_D._Roosevelt\r\nAccept: */*\r\nAccept-Language: en-us\r\n_Accept-Encoding: gzip, deflate\r\nConnection: keep-alive\r\n\r\n"
import socket
s = socket.socket()
s.connect(("en.wikipedia.org",80))
s.send(string)
x = s.recv (1000)
while (x):
print x
x = s.recv (1000)
所以我运行了这个家伙,发现维基百科非常友好地及时完整地返回了我的数据。那么到底发生了什么?
“这总是我的错”开始出现在我的每一件礼物、偏执的盔甲上,我决定看看其他iPhone应用程序是否可以查看这些URL。我贴了一张
tweet
用一个具有讽刺意味的有趣(我很容易被逗乐)的URL,看看Tweetie是否可以查看该URL。不可能。
一位朋友用推特语尝试了一下。同样的问题。在Safari和Wikipedia应用程序中运行良好,但看起来iPhone应用程序使用的是bog标准
维基百科页面出现问题。
simple test app
http://en.wikipedia.com
,它失败并出现相同的错误(在末尾添加了该代码)。
你们怎么想?这仅仅是一个简单的例子吗
UIWebView
缺陷有没有人知道这里发生了什么?
我是否错过了一些显而易见的事情,而我又一次坐在火车上不穿裤子上班了?
期待听到你的想法。请记住,这是工作良好,昨天。
(或者,验尸更合适):
谢谢
Duncan
对于解决方案和这里发生的事情的非常清晰的描述。
看起来是我最初看到错误的原因,当时我没有实现
迪德罗
委托方法的本质是,该方法的默认行为显然是清除
UIWebView
在回调中忽略-999错误代码似乎是一个非常糟糕的解决方案,但我对管道胶带没意见。
我尝试了很多应用程序来测试这是否是UIWebView问题(Tweetie、Twitteriffic等),他们都有这个问题。看起来这可能是开发人员的一个相当常见的疏忽。也许苹果可以在下一个版本中解决这个问题。
另一个有趣的点是,当我切换我的URL使用
http://en.m.wikipedia.com
而不是
,问题消失了。
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
_webView = (UIWebView*)self.view;
_webView.delegate = self;
// load the url
// FAIL
//NSURL * newUrl = [[[NSURL alloc] initWithString:@"http://en.wikipedia.com"] autorelease];
// OK
NSURL * newUrl = [[[NSURL alloc] initWithString:@"http://www.stackoverflow.com"] autorelease];
NSURLRequest * newUrlRequest = [NSURLRequest requestWithURL:newUrl];
[_webView loadRequest:newUrlRequest];
}
// delegate stuff
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)req navigationType:(UIWebViewNavigationType)navigationType { return YES; }
- (void)webViewDidStartLoad:(UIWebView *)wv
{
// starting the load, show the activity indicator in the status bar
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
// finished loading, hide the activity indicator in the status bar
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
NSURLErrorDomain
// load error, hide the activity indicator in the status bar
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
[_webView loadHTMLString:[[[NSString alloc] initWithFormat:@"Failed to load page %@", [error localizedDescription]] autorelease] baseURL:nil];
}