单击链接时,UIWebView不调用shouldStartLoadWithRequest ||在UIWebView中捕获链接点击

时间:2014-02-01 21:07:08

标签: uiwebview youtube youtube-api

所以这个问题需要比可可知识更多的网络知识。我只知道网络的基础知识。这也是一个边缘情况(虽然我的样本量很小)。

我正在使用一项功能,将来自youtube的视频交叉发布到我们的应用中。

所以我有browserController并加载http://m.youtube.com并且加载正常。初始加载时调用shouldStartLoadWithRequest。但是,如果我点击链接转到视频页面,则永远不会调用shouldStartLoadWithRequest

我已尝试过其他几个网站(nba.com和vimeo.com)并按预期工作,shouldStartLoadWithRequest在点击链接时调用,这样我就相信没有任何问题我的browserController或我的UIWebView代码,这是YouTube网站处理链接点击的方式所特有的。

知道发生了什么以及如何确保调用shouldStartLoadWithRequest或者另外听点击链接?

PS。我不知道如何标记这个,以便它引用可能涉及的Web框架。

3 个答案:

答案 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. javascript注入以捕获页面更改(阅读history.pushState)。
  2. KVO监视对webview的更改(如滚动视图调整大小)
  3. 观看标题更改,如上所述。
  4. 每次用户点按视图时都会检查更新。
  5. 使用符合您需求的任何一个。

答案 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>