【问题标题】:UIWebView not calling shouldStartLoadWithRequest when link is clicked || Capturing link clicks in UIWebView点击链接时 UIWebView 不调用 shouldStartLoadWithRequest ||在 UIWebView 中捕获链接点击
【发布时间】:2014-02-25 12:59:10
【问题描述】:

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

我正在尝试将 YouTube 中的视频交叉发布到我们的应用中的功能。

所以我有一个browserController,我加载了http://m.youtube.com,它加载得很好。 shouldStartLoadWithRequest 在初始加载时被调用。但是,如果我单击链接转到视频页面,则永远不会调用 shouldStartLoadWithRequest

我尝试了其他几个网站(nba.com 和 vimeo.com),它们按预期工作,点击链接时会调用 shouldStartLoadWithRequest,所以这让我相信我的 @ 没有任何问题987654326@ 也不是我的 UIWebView 代码,这是 youtube 网站处理链接点击的方式所特有的。

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

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

【问题讨论】:

    标签: uiwebview youtube youtube-api


    【解决方案1】:

    尝试这些类似问题的答案:

    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

    【讨论】:

    • 很确定这不是问题。 UIWebView 在站点初始加载时存在,并且正在调用委托方法。再一次,它正在监听我尝试过的其他几个站点(nba.comvimeo.com)中的链接点击,但未捕获点击 m.youtube.com 中的链接。
    • @SmoothAlmonds 好的,这可能是 youtube 的网络编程要做的事情。我会继续寻找答案
    • 是的,我很确定就是这样。故意阻止我在做什么?...实现目标的另一个选择是使用他们的Data API 并创建youtubeSearchVC 的简单版本,无论如何我们可能都会这样做......我们只想要最简单的初始测试实现。
    【解决方案2】:

    我决定走一条不同的路线,并创建了一个 NSTimer,它使用 javascript 定期获取当前 url。当它改变时,我知道页面切换了。如果调用 shouldStartLoadWithRequest ,我会短暂禁用计时器。我在成功加载时重新启用它。

    它并不完美,但足以满足我的需求,并且可以在 m.youtube.com 上运行。我想有一些更高级的 javascript 也可以专门获得链接点击,但只需检查 url 更新就可以了。

    // 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 监视 web 视图的变化(如滚动视图调整大小)
    3. 注意标题变化,如上。
    4. 每次用户点击视图时检查更新。

    使用对您的需求有意义的任何一个。

    【讨论】:

    • 我确信这不是最好的解决方案,但它对我有用。非常感谢!
    • 见我上面的更新。我认为,其他一些解决方案可以更可靠地工作。我注意到有时如果连接缓慢或发生其他事情,计时器可能会有点混乱。
    【解决方案3】:

    http://m.youtube.com 通过 AJAX 处理所有链接。但是 XHR 请求不会调用 shouldStartLoadWithRequest。您需要在每次 XHR 请求后注入 JavaScript 代码,以重新加载页面(请参阅 Knowing when AJAX has loaded in UIWebView 以获取 UIWebView)或将消息发送到本机应用程序(请参阅 How can i monitor requests on WKWebview? 以获取 WkWebView)。

    【讨论】:

    • 虽然理论上这可以回答这个问题,it would be preferable 在这里包含答案的基本部分,并提供链接以供参考。不要只添加链接,而是自己包含步骤。
    猜你喜欢
    • 2011-07-11
    • 1970-01-01
    • 2018-01-29
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多