如何访问 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 的子窗口上下文的主要内容,如果未能解决你的问题,请参考以下文章
如何在Knex中扩展QueryBuilder类时访问当前上下文的事务