在 iOS 共享扩展内的 WKWebView 中提交登录表单会导致共享扩展关闭

dea*_*ixl 5 webview ios wkwebview react-native

背景:

我们正在构建一个 React Native 应用程序,它允许用户创建包含博客文章或新闻文章引用的帖子。为了实现这一目标,我们构建了一个共享扩展,它在模态中显示 React Native 视图。在 RN 视图中,我们使用react-native-webview(在 iOS 上呈现为 WKWebView)来显示共享的页面,允许用户选择页面上的一些文本(通过注入内容脚本),并继续创建帖子。

问题:

我们的用户想要分享的一些新闻网站有付费墙,例如《金融时报》、《纽约时报》等 - 在这些网站上,用户必须在网络视图中登录。这并不理想,但一旦他们登录,由于我们在网络视图上启用了 cookie,他们的会话将被记住。该解决方案在 Android 上运行良好,从 Safari 共享时在 iOS 上也运行良好。

然而,当从 iOS 上的应用程序共享时,一旦用户在 Web 视图中提交登录表单,共享扩展就会关闭,将用户带回到发起共享操作的应用程序。

以下是 Guardian 应用程序中发生的问题的视频演示:

https://www.youtube.com/watch?v=DFnh1x3j4xs

观察结果:

onShouldStartLoadWithRequest当使用组件的 prop观察 webview 中发生的请求时WebView,在提交登录表单时,有两个请求,iOS 将其报告navigationTypeformSubmitted.

通过检查方法navigationType的内部onShouldStartLoadWithRequest,我能够允许第一个formSubmitted请求通过,但取消后续请求。这阻止了共享扩展关闭,但在单击链接返回主页后,共享扩展被关闭。

我目前的理论是,启动共享的应用程序以某种方式挂钩到表单提交事件,因为这些应用程序通常使用 webviews 作为自己的登录过程 - 因此,尽管此 webview 在我们自己的进程中运行,但也许该应用程序仍然以某种方式挂钩进入这个过程。

值得注意的是,新闻应用程序之间的这种行为不一致,可能是由于它们处理登录过程的方式存在差异。

最初,这个问题也出现在 BBC 应用程序中,但在我们没有做出任何更改的情况下,在某个时候就不再发生了,因此它有点间歇性,或者可能基于存储的数据/cookie。

概括

我们希望完全理解为什么会出现这种行为,并且希望有一种解决方案或解决方法可以防止共享扩展在提交登录表单时关闭。