代码之家  ›  专栏  ›  技术社区  ›  RedBlueThing

有人发现UIWebView在某些URL上失败了吗?

  •  16
  • RedBlueThing  · 技术社区  · 16 年前

    我已经在一个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];
    }
    
    1 回复  |  直到 8 年前
        1
  •  17
  •   Community Mohan Dere    8 年前

    看起来这里有个答案:

    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:didFailLoadWithError:delegate:

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

    本质上,发生的事情是代理得到了一个“已取消”(-999)的失败,这可能源于javascript,甚至可能源于UIWebView错误。

    在代码中,webview根本不显示任何内容,因为您使用的是同一个UIWebView来显示错误。如果您刚刚记录了错误,您可能会看到一个失败,但是页面会加载得很好,提示您失败是假的。