为什么iFrame内的链接会在系统Safari中打开?

9
在构建之间(我不确定是什么改变触发了这个问题),一个应用在iOS上的行为如下:
  • 主网页加载index.html,并且其中有一个包含多个锚点的iframe
  • 除非经过JavaScript从index.html运行进行操作和重定向,否则锚点将保留在iFrame内部
现在的表现是:
  • 主网页加载index.html,并且其中有一个包含多个锚点的iframe
  • 单击iFrame内部的任何锚点或触发位置更改的任何操作都会导致新页面在Safari App中加载,而不是在iFrame内部加载
我已安装最新版本的cordova-plugin-inappbrowser(此时为1.3.0),但似乎没有影响任何内容。
我已验证我仍然能够使用来自index.html的JavaScript更改框架内锚点的属性以及添加事件。
我正在使用以下CSP:

<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval';">

我不确定这是否与此有关。

我尝试了许多iframe沙盒属性,试图看看哪些是有效的,但没有任何一个改变结果。 目前它是:

<iframe id="the-iframe" sandbox="allow-scripts allow-modals allow-popups allow-popups-to-escape-sandbox allow-top-navigation allow-forms allow-same-origin"></iframe>

iframe的src是动态设置的。

我在cordova上开了一个错误报告,以查看这是否可能是一个错误而不是一个功能。


你在应用程序中如何使用 cordova-plugin-inappbrowser?也许你正在强制所有链接都使用 inappbrowser 打开,就像这里所描述的那样? - Dexter
我最初使用inappbrowser来捕获某些链接点击事件,并手动在“_system”目标中打开它们,但现在已经删除了代码和插件,问题仍然存在。 - Phil Barresi
所以我刚刚使用cordova-ios 3.8.0重新构建了它,没有任何问题,但是使用cordova-ios 4.1.1构建会导致此问题。看起来我至少已经确定了如何找出这个变化。 - Phil Barresi
1个回答

3

我现在正在处理一个新应用程序的问题,似乎与 Cordova iOS > 6 中的新白名单模式有关。对于我们来说,我已经为允许 iframe 内部导航制定了一种解决方法(我不能确定它是否会产生其他问题,但目前我们还没有遇到过任何问题)。

在 Cordova 项目中,在 Private/Plugins/CDVUIWebViewEngine/CDVIntentAndNavigationFilter.m 中,我们只是修改了 shouldOverrideLoadWithRequest:navigationType: 方法,在通过 UIWebViewNavigationTypeLinkClicked 请求导航时更改行为。

使用新的 Cordova 行为,这种情况下它停止导航,并在系统浏览器中打开;我已经注释掉了那一行 ([[UIApplication sharedApplication] openURL:url];) 并修改了返回值为 return YES;通过这两个更改,它可以像之前的 Cordova 版本一样工作:

case UIWebViewNavigationTypeLinkClicked:
    // Note that the rejection strings will *only* print if
    // it's a link click (and url is not whitelisted by <allow-*>)
    if ([self.allowIntentsWhitelist URLIsAllowed:url logFailure:NO]) {
        // the url *is* in a <allow-intent> tag, push to the system
        //[[UIApplication sharedApplication] openURL:url];
        return YES;
    } else {
        [errorLogs addObject:[NSString stringWithFormat:allowIntents_whitelistRejectionFormatString, [url absoluteString]]];
    }

我认为这种行为应该可以从config.xml参数中进行配置,但对于我们来说,目前这个解决方法已经足够了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接