OpenAllWhitelistURLsInWebView

Posted

技术标签:

【中文标题】OpenAllWhitelistURLsInWebView【英文标题】: 【发布时间】:2012-05-31 17:45:53 【问题描述】:

为了允许嵌入 Vimeo 视频,我设置了“”=“yes”。但既然我这样做了,它只会打开列入白名单的项目,并显然在 webview 中打开它们。我需要在 safari 浏览器中打开所有非白名单项目,而不是 webview。关于如何实现这一点的任何想法?

科尔多瓦 1.7 | XCode 4.3.2 | jQuery 1.7.1 | jQueryMobile 1.1.0 | ios 5.1

【问题讨论】:

这个家伙几乎完全符合我的需要:***.com/a/9748173/1193081。现在我只需要了解如何将条件格式化为“if [url scheme] === 'vimeo.com'”......有什么想法吗? 您不想测试 url 方案。您想测试 vimeo 的完整 URL,因此您使用 rangeOfString,类似于我发布的内容。我输入了该代码,因为我无法访问我的 Mac,所以可能有一些语法错误需要修复 :-) 这篇文章回答了你的问题***.com/questions/11035059/… 【参考方案1】:

我不知道与 Cordovoa 的确切区别,但我正在使用 PG 1.4.1,并且我的 PhoneGap.plist

中有此设置

这在我的 AppDelegate.m

- (BOOL) webView:(UIWebView*)theWebView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType

    NSURL *url = [request URL];

    if([[url absoluteString] rangeOfString:@"vimeo.com"].length > 0 || [[url scheme] isEqualToString:@"file"])
        return [self.viewController webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType ];
    

    [[UIApplication sharedApplication] openURL:url];
    return NO;

这是我用PG打开的非常简单的index.html

<body>
   <a href="http://www.vimeo.com">Vimeo</a>
   <a href="http://www.google.com">Google</a>
</body>

vimeo 链接在 webview 中打开,google 链接在 Safari 中打开。

更新 Cordova 1.7

显然,在最新版本的 PhoneGap/Cordova(我认为是 1.6.1)中没有调用 shouldSTartLoadWithRequest 函数。所以,现在如果你想在 Safari 中打开一个链接,你需要将 a 标签的target 属性设置为_blank。由于您并不总是可以访问代码,这里有一个脚本可以提供帮助。

<head>
    <script type="text/javascript" src="cordova-1.7.0.js"></script>
    <script>  
        document.onclick = checkLink;
        function checkLink(e) 
            var url = e.target.href;
            if(url.indexOf('vimeo.com') == -1)
                window.open(url,'_blank');
            
        
    </script>
</head>
<body>
    <a href="http://www.vimeo.com">Vimeo</a>
    <a href="http://www.google.com" target="_blank">Google</a>
</body>

【讨论】:

对于cordova 1.7,在AppDelegate.m 底部附近添加该代码不会做任何事情。在方法中放置断点表示它没有被调用。 我认为 _blank 更改尚未针对 iOS 实施。 issues.apache.org/jira/browse/CB-362 说它已经发布到 2.0 版。 我已经在 Simulator 5.1 上尝试过,它会在 Safari 中打开 google.com,并在应用程序中打开 Vimeo。 对于科尔多瓦 1.7,我是否需要将脚本放在 html 中作为 appdelegate 中的脚本...或者我可以跳过应用程序委托吗?感谢您的帮助! 嘿,我得到了可以使用的链接,但这不适用于 iFrame。 iframe 将我从应用程序中踢到实际视频中。 ...关于如何纠正此操作的想法,几乎就在那里。谢谢!【参考方案2】:

它应该已经这样做了,但既然你在这里发帖,我猜它没有。

您可以做的是覆盖 AppDelegate.m 文件中的 shouldStartLoadWithRequest 方法。您可以添加您想要检查的条件(例如包含 vimeo 的 URL)并返回 true,否则返回 false。

    if ( [request.URL.absoluteString rangeOfString:@"vimeo.com"].location != NSNotFound) 
            return [ super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType ];


    //open in Safari
    [[UIApplication sharedApplication]openURL:request.URL];
    return NO;

【讨论】:

该代码似乎给了我一些错误。我只是把它放在我的 appdelegate.m 的末尾。它给了我两次以下错误:“预期标识符或'('”......想法?【参考方案3】:

所以我使用的是 Cordova 1.9。稍作调试后,我看到函数 shouldStartLoadWithRequest 现在应该在 MainViewController.m 文件中实现,而不是在 AppDelegate.m 文件中实现。这就是它永远不会被触发的原因。

在从 PhoneGap 1.4.1 更新到 Cordova 1.9 后发现了这一点。

【讨论】:

以上是关于OpenAllWhitelistURLsInWebView的主要内容,如果未能解决你的问题,请参考以下文章