所以这个问题需要比可可知识更多的网络知识。我只知道网络的基础知识。这也是一个边缘情况(虽然我的样本量很小)。
我正在使用一项功能,将来自youtube的视频交叉发布到我们的应用中。
所以我有browserController
并加载http://m.youtube.com
并且加载正常。初始加载时调用shouldStartLoadWithRequest
。但是,如果我点击链接转到视频页面,则永远不会调用shouldStartLoadWithRequest
。
我已尝试过其他几个网站(nba.com和vimeo.com)并按预期工作,shouldStartLoadWithRequest
在点击链接时调用,这样我就相信没有任何问题我的browserController
或我的UIWebView
代码,这是YouTube网站处理链接点击的方式所特有的。
知道发生了什么以及如何确保调用shouldStartLoadWithRequest
或者另外听点击链接?
PS。我不知道如何标记这个,以便它引用可能涉及的Web框架。
答案 0 :(得分:4)
我决定采用不同的路线并创建一个NSTimer,定期使用javascript抓取当前网址。当它改变时,我知道页面已切换。如果调用了shouldStartLoadWithRequest,我会暂时禁用计时器。我成功加载后重新启用它。
它并不完美,但可以满足我的需求并且可以在m.youtube.com上运行。我想有一些更高级的JavaScript也可以专门获得链接点击,但只是检查网址更新工作正常。
// assume self.currentURL and self.updateTimer exist in controller
// check every 2 seconds
-(void) startTimer {
[self stopTimer];
self.updateTimer = [NSTimer scheduledTimerWithTimeInterval:2.0
target:self
selector:@selector(timerUpdate)
userInfo:nil
repeats:YES];
}
-(void) stopTimer {
[self.updateTimer invalidate];
self.updateTimer = nil;
}
-(void) timerUpdate {
NSString *title = [self.webView stringByEvaluatingJavaScriptFromString:@"document.title"];
NSString *url = [self.webView stringByEvaluatingJavaScriptFromString:@"document.URL"];
if (![url isEqualToString:self.currentURL]) {
NSLog(@"New URL: %@", url);
self.currentURL = url;
}
// update back/forward buttons here
}
更新:不幸的是,现在针对这个特定问题的所有解决方案都是一个小问题。这个演讲提供了一些其他的想法:http://vimeo.com/61488911
选项归结为:
使用符合您需求的任何一个。
答案 1 :(得分:0)
尝试以下类似问题的答案:
shouldStartLoadWithRequest is never called
Undeclared delegate and shouldStartLoadWithRequest
并确保设置代理人。
webview.delegate = self;
另外,请看这里:UIWebView Link Click
在评论中,有人说:Actually it won't always be called. For example, in some m.youtube.com pages.
在多个问题中,我继续看到这在m.youtube.com
中不起作用。就像在这篇文章中一样:iPhone - UIWebview - Get the URL of the link clicked
答案 2 :(得分:0)
http://m.youtube.com
通过AJAX处理所有链接。但是没有为XHR请求调用shouldStartLoadWithRequest
。您需要注入可重新加载页面的JavaScript代码(请参阅UIWebView
的{{1}})或在每个XHR请求后向本机应用程序发送消息(请参阅WkWebView
获取m.addAttribute("employees", employees);
)。 / p>