如何访问 UIWebView 的子窗口上下文

Posted

技术标签:

【中文标题】如何访问 UIWebView 的子窗口上下文【英文标题】:How to access UIWebView's child window context 【发布时间】:2016-05-18 19:16:25 【问题描述】:

我有一个在 UIWebView 包装器中运行的应用程序(应用程序 A)。我有另一个应用程序(应用程序 B)需要显示并接受来自第一个应用程序的一些数据。目前,我们正在包装器中检测window.open(来自应用程序 A),并使用第二个 WebView 创建一个新控制器,该控制器滑入并包含应用程序 B。

在应用 A 的 JS 代码中:

var appBWindow = window.open("APP_B_URL");

// Checking inside of setInterval for existence 
// of the .init() that is set by app B on its window
// when it's found we call it and pass it some data
function onAppBWindowLoad() 
   appBWindow.init(someData);

这在桌面和 ios Safari 上都可以正常工作,但使用 UIWebView appBWindow.init 永远不会改变。看起来JSContexts 的连接方式与它们在 Safari/Chrome 中的连接方式不同。

有没有办法确保appBWindow 的工作方式与普通浏览器中的一样?

【问题讨论】:

【参考方案1】:

通过应用 A 和应用 B,您是否在使用两个不同的 iOS 应用?或者两个不同的网页视图在同一个 iOS 应用中?我猜你说的是后者。

同一应用程序中的 Web 视图共享相同的 sessionStorage,您可以使用它来共享数据。要在 Web 视图之间调用函数,请使用 stringByEvaluatingjavascriptFromString(_:) 方法。

例如:

斯威夫特

let result = myWebView.stringByEvaluatingJavaScriptFromString("onAppBWindowLoad()")

onAppBWindowLoad 有这个实现:

function onAppBWindowLoad() 
    return someData

注意:您可能会发现my question 在这里很有用。

【讨论】:

是的,抱歉,应用 A 和应用 B 都是 WebView 内的 JavaScript 应用。我知道stringByEvaluatingJavaScriptFromString,我现在将其用作解决方法。我还设法使用 JSContext 实现了一个更好的解决方案,但我仍然认为应该有一种简单的方法来“连接”这两个 WebView,这样它们就可以像使用 var child = window.open(...) 时的浏览器窗口/选项卡一样共享 JS 上下文(在同一个域上)

以上是关于如何访问 UIWebView 的子窗口上下文的主要内容,如果未能解决你的问题,请参考以下文章

如何传递多个值以响应本机上下文 API

如何在Knex中扩展QueryBuilder类时访问当前上下文的事务

MFC - 获取特定窗口的设备上下文

功能组件的子事件处理程序中的'this'上下文

Zend Validate - 你如何从不同的子表单传递上下文值?

去掉UIWebView上下滚动出边界时的黑色阴影