我正在使用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提供的黑客攻击框架?