gpt4 book ai didi

iphone - 有没有人发现 UIWebView 对于某些 URL 失败?

转载 作者:行者123 更新时间:2023-12-03 18:22:43 25 4
gpt4 key购买 nike

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

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

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

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

NSURLErrorCancelled

Returned when an asynchronous load is canceled.

A Web Kit framework delegate will receive this error when it performs a cancel operation on a loading resource. Note that an NSURLConnection or NSURLDownload delegate will not receive this error if the download is canceled.

所以这听起来像是在原始请求完成之前发出新请求(或取消)。我检查我的代码是否有类似的内容,但结果是空的。

因此,我陷入了往常的偏执螺旋式下降,并假设维基百科正在阻止基于 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)

所以我运行了这个家伙,发现维基百科非常友善地迅速且完整地返回了我的数据。那么这是怎么回事?

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

一位 friend 在 Twitterific 中尝试了它。同样的问题。在 Safari 和维基百科应用程序中工作正常,但使用沼泽标准 UIWebView 的 iPhone 应用程序在处理维基百科页面时似乎存在问题。

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

那么大家觉得怎么样呢?这只是一个UIWebView错误吗?有哪位苹果大佬知道这是怎么回事吗?

我是否错过了一些完全明显的事情,而我再次不穿裤子坐在火车上上类?

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

汇报(或者也许事后剖析更合适):<​​/p>

谢谢Duncan的解决方案以及对这里发生的情况的非常清晰的描述。

看起来我最初看到错误的原因是,当我根本没有实现 didFailLoadWithError 委托(delegate)方法时,该方法的默认行为显然是清除 UIWebView 并因此终止请求。当我添加实现以了解发生了什么情况时,我插入了一些代码以将错误写入 View ,正如邓肯所指出的,这就是我遇到的问题。

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

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

另一个有趣的点是,当我将 URL 切换为使用 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];
}

最佳答案

看起来这里有一个答案:

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.
}

本质上,发生的事情是委托(delegate)遇到“取消”(-999)失败,这可能源于 javascript,甚至可能源于 UIWebView bug。

使用您的代码, WebView 根本不显示任何内容,因为您使用相同的 UIWebView 来显示错误。如果您刚刚对错误进行了 NSLog,那么您会看到失败,但是页面会加载得很好,从而提示您失败是伪造的。

关于iphone - 有没有人发现 UIWebView 对于某些 URL 失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1577670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com