允许导航白名单不会先测试" UIWebViewNavigationTypeLinkClicked" Cordova上的活动iOS@4.0.0

时间:2015-12-16 19:45:06

标签: cordova cordova-plugins

我正在使用Cordova 5.4.1创建一个示例应用程序来评估Cordova ios@4.0.0,现在遇到了一个问题。

我的示例应用程序打算在Webview中访问https://www.google.co.jp/ *,并在访问其他域时打开系统浏览器。

以下是我编写的示例代码。

·index.html的

<html>
<head>
    <meta name="format-detection" content="telephone=no">
    <meta name="msapplication-tap-highlight" content="no">
    <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width">
    <link rel="stylesheet" type="text/css" href="css/index.css">
    <script type="text/javascript">
 // open google on start up.
    var ref = window.open("https://www.google.co.jp", '_self', 'location=no');
    </script>
    <title>Hello World</title>
</head>
<body>
    <div class="app">
        <h1>Apache Cordova</h1>
    </div>
</body>
</html>

·config.xml中

...
<access origin="*" requires-forward-secrecy="false" />
<!-- Added google.co.jp to allow open in webview -->
<allow-navigation href="https://www.google.co.jp/*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
...

我了解我们可以访问webview中<allow-navigation>标记中定义的域或网址。 如果没有,Cordova会在<allow-intent>标签中定义系统浏览器(例如Safari,android浏览器等)时打开它们。

但是在ios@4.0.0上,当我点击Google域下的链接时,系统浏览器就会打开,例如https://www.google.co.jp/imghp。 (另一方面,这段代码在android@4.1.1上运行良好)

我终于发现我必须破解ios@4.0.0提供的obj-c本机代码。

在CDVIntentAndNavigationFilter.m中,允许导航白名单在UIWebviewNavigationTypeLinkClicked事件发生后允许意图白名单后进行测试。 所以我首先添加了测试允许导航白名单的代码。

·CDVIntentAndNavigationFilter.m

- (BOOL)shouldOverrideLoadWithRequest:(NSURLRequest*)request     navigationType:(UIWebViewNavigationType)navigationType
{
    NSURL* url = [request URL];

    switch (navigationType) {
        case UIWebViewNavigationTypeLinkClicked:
            // Note that the rejection strings will *only* print if
            // it's a link click (and url is not whitelisted by <allow-*>)

            // FIXME suppose we should test the navigation whitelist first
            // ↓↓ this code not exists in cordova iOS@4.0.0 at this moment
            if ([self.allowNavigationsWhitelist URLIsAllowed:url]) {
                // the url is in the <allow-navigation> tag, so we can navigate to this url
                return YES;
            }
            // ↑↑ this code not exists in cordova iOS@4.0.0 at this moment

            if ([self.allowIntentsWhitelist URLIsAllowed:url]) {
                // the url *is* in a <allow-intent> tag, push to the system
                [[UIApplication sharedApplication] openURL:url];
                return NO;
            }
            // fall through, to check whether you can load this in the webview
        default:
            // check whether we can internally navigate to this url
            return ([self.allowNavigationsWhitelist URLIsAllowed:url]);
    }

我不确定这个问题是不是错误。如果是,我会尝试向社区报告一个问题,如果没有,是否有任何解决方法可以避免这个问题而没有Cordova提供的黑客攻击框架?

0 个答案:

没有答案