有没有人发现某些URL的UIWebView失败了?

时间:2009-10-16 12:06:27

标签: iphone uiwebview

我已经在iPhone应用程序上工作了几个星期,我添加的早期功能之一是 UIWebView ,它加载了上下文敏感的维基百科页面主题。这实现起来非常简单,并且已经工作了一段时间。

今天,我发现功能意外停止了工作。我一直在那段代码的周边摆弄,最初认为我已经破坏了一些东西。

我检查了所有显而易见的地方,我的网址是 UIWebView 仍然连接在XIB等。我没有发现任何问题。

进一步调查,我在 UIWebViewDelegate didFailLoadWithError 上遇到了一些错误处理,发现我收到了-999错误:

  

NSURLErrorCancelled

     

异步加载时返回   取消。

     

Web Kit框架委托将   执行时收到此错误   取消加载操作   资源。注意NSURLConnection   或NSURLDownload代表不会   如果下载,则会收到此错误   取消。

所以这听起来像是在原始请求完成之前发出新请求(或取消)。我检查了我的代码是否有这样的东西,然后空了。

所以我进入了我惯常的偏执狂,并假设维基百科正在阻止基于UAgent或其他东西的请求,并继续进行一些疯狂的追逐,试图欺骗我回到幸福的地方。这些尝试没有成功,最终理智得到了胜利。我创建了一个简单的python脚本来模仿我在模拟器中从我的APP发出的HTTP请求,看看维基百科发回的内容:

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)

所以我经营这个人并发现维基百科非常友好地及时完整地返回我的数据。那是怎么回事?

Chinks开始出现在我的每一个礼物,偏执的盔甲“这总是我的错”,我决定检查其他iPhone应用程序是否可以查看这些URL。我发布了一个tweet,其中有一个具有讽刺意味的有趣(我很容易被逗乐)网址,并查看Tweetie是否可以查看该网址。它不能。

一位朋友在Twitterific中试一试。同样的问题。在Safari和维基百科应用程序中运行良好,但似乎使用沼泽标准 UIWebView 的iPhone应用程序在维基百科页面上遇到问题。

为了完全确定没有其他变量,我创建了simple test app只有一个加载 http://en.wikipedia.com的UIWebView,它失败并出现相同的错误(添加了该代码最后)。

那你们觉得怎么样?这只是一个 UIWebView 错误吗?任何苹果公司的人都知道这里发生了什么事吗?

我是否错过了一些完全明显的东西,我再一次坐在火车上没穿裤子就能上班?

期待听到您的想法。请记住,昨天工作正常。

汇报(或者说Post Mortem更合适):<​​/ p>

感谢Duncan提供解决方案,并清楚地说明了这里发生了什么。

看起来我最初看到错误的原因是,当我没有实现 didFailLoadWithError 委托方法时,该方法的默认行为显然是清除 UIWebView 并因此终止请求。当我添加我的实现以了解发生了什么时,我坚持使用一些代码将错误写入视图,正如Duncan所指出的那样,这就是我得到的。

似乎是一个非常糟糕的解决方案,可以忽略回调中的-999错误代码,但我对胶带很好。

我尝试了很多应用来测试这是否是一个UIWebView问题(Tweetie,Twitteriffic等等),他们都有问题。看起来这对开发人员来说可能是一个非常常见的疏忽。也许Apple可以在下一个版本中清理它。

其他有趣的一点是,当我将网址切换为使用http://en.m.wikipedia.com代替http://en.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];
}

1 个答案:

答案 0 :(得分:17)

看起来这里有一个答案:

How do I fix NSURLErrorDomain error -999 in iPhone 3.0 OS

反过来指的是:

http://www.iphonedevsdk.com/forum/iphone-sdk-development/6280-uiwebview-didfailloadwitherror-how-get-errors-code-list.html

在webView中看起来你需要这样的hack:didFailLoadWithError:delegate:

if ([error code] != NSURLErrorCancelled) {
    //show error alert, etc.
}

实质上发生的事情是委托正在获得“取消”(-999)失败,这可能源于javascript或者甚至是UIWebView错误。

使用您的代码,webview根本不显示任何内容,因为您使用的是相同的UIWebView来显示错误。如果你只是NSLog的错误,你会看到失败,但然后页面会加载很好,给你一个暗示失败是假的。