- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在 Web View 之外使用 WKWebView 提供的异步功能。JS 上下文选项不提供异步功能。
在WKWebView中,我的逻辑是这样写的。
func swiftFunc1() {
webView.evaluateJavaScript("jsFunc1(), completionHandler: nil)
}
在 javascript 代码中,我向 swift 发送消息
function jsFunc1() {
window.webkit.messageHandlers.myMsg.postMessage("call swiftFunc2");
}
然后,swift 代码可以调用适当的 JS 回调作为处理消息的一部分。
但这取决于 webview 是前景 View 。如果我想使用独立于 webview 的 JS 逻辑,可以选择 JSContext。我试过以下
func swiftFunc1() {
myCtxt = JSContext()
exportedToJS = exportToJS() //confirms to JSExport and uses @objc
myCtxt.setObject(exportedToJS.self, forKeyedSubscript: "swiftIface")
myFunc = myCtxt.objectForKeyedSubscript("jsFunc1")
myFunc.callWithArguments(nil)
}
现在在 javascript 代码中我无法向 swift 发送消息。如果我尝试按如下方式调用 swift 函数,代码将永远卡住。
function jsFunc1() {
swiftIface.swiftFunc2() // This creates a deadklock
}
如何在不从被调用的 Javascript 函数 jsFunc1()“返回”的情况下实现以下任一目标?
向 swift 发送消息,以便它采取适当的操作
或者调用一个 swift 函数,以便采取适当的操作
最佳答案
如果您不希望您的 javscript 在执行后终止,我的理解是否正确?
如果我理解错了,也许下面的帮助(我不在家使用 Mac 进行测试,但如果您按如下方式修改代码,也许它会起作用)。
选项 1: block
swiftFunc1 可能如下所示:
func swiftFunc1() {
myCtxt = JSContext()
myCtxt.setObject(unsafeBitCast(swiftFunc2, AnyObject.self), forKeyedSubscript: "swiftFunc2")
exportedToJS = exportToJS() //confirms to JSExport and uses @objc
myCtxt.evaluateScript("swiftFunc2()")
}
你的 swiftFunc2 看起来像这样:
let swiftFunc2: @convention(block) Void -> Void = {
// do something here
}
您的 JS 代码将如下所示:
function jsFunc1() {
swiftFunc2();
}
选项 2:JSExport您有一个可供所有 javascript 访问的导出类:
import Foundation
import JavaScriptCore
@objc class JavascriptHandler: NSObject, JavascriptHandlerExport {
let context: JSContext = JSContext()
init () {
context.setObject(self, forKeyedSubscript: "MyJSHandler") // set the object name for self accessible in javascript code
}
func swiftFunc1() {
context.evaluateScript("MyJSHandler.swiftFunc2();")
}
func swiftFunc2 () {
// do something here
}
}
你的导出类的协议(protocol)。在这里你必须声明你想要使用 Javascript 的所有属性和方法。
import Foundation
import JavaScriptCore
@objc protocol JavascriptHandlerExport: JSExport {
func swiftFunc2 ( ) -> Void
}
有了它,您应该可以从 javascript 调用一个函数并让它继续运行。在这个例子中,您现在可以像这样从 Javascript 访问类 JavascriptHandler 的函数:
MyJSHandler.swiftFunc2();
如果你想将你的 WebView 所在的类与你的 JS 逻辑所在的类分开,那也应该不是问题。您还应该能够将 block 语法与 JSExport 方法结合起来。
如果它没有按预期工作/表现,请告诉我。
关于swift - swift与Javascriptcore的异步通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38283348/
所以我想了解 JavascriptCore 的工作原理。 所以首先我尝试调用单个函数,但现在我尝试调用类中的函数。 我的 javascript 代码是这样的 var sayHelloAlfred =
我正在尝试从 swift 类的单例实例中调用方法。 这是我的协议(protocol): @objc public protocol MyProtocol: JSExport { var nam
我正在考虑在应用程序中嵌入 JavaScriptCore。我很好奇它的便携性如何?理想情况下,我希望它能够在 Linux、Windows 和 OSX 以及 Android 和 iOS 上运行。自然 O
我正在尝试使用 iOS 应用程序连接到 Node.JS 服务器,但我没有使用第 3 方 native 库,而是尝试将其与 JavaScript Socket.IO 客户端连接并传递数据我正在接收我的
我有一个使用 JavaScriptCore 的 UIWebView。我正在尝试从网页调用 ObjC 函数。但是,该函数需要异步调用,因此我传入了一个在调用异步 ObjC 函数时调用的回调函数。 我的理
考虑以下带有 NSObject * 属性的 JSExported objective-c 类: @protocol MyObjectExport @property (nonatomic, stro
我在使用 JavaScriptCore 时遇到了一些奇怪的问题。每当我向我的类添加一个带有参数的方法时,它似乎都没有被导出(或者以一个奇怪的名称导出)。例如: import Cocoa import
我整理了一个非常简单的程序,它使用 JavaScriptCore 来评估 JS: #import #import int main(int argc, const char * argv[]) {
我想在 JavascriptCore 上下文中定义一个函数,该函数采用可变数量的参数。 类似这样的事情: JSVirtualMachine* virtualMachine = [[JSVirtualM
我在 React Native 中遇到了一个复杂的竞争条件问题。在编译时发出警告是否会显着影响 javascript 包的初始化时间? javascript 包是一个 130,000 行的文件,我怀疑
JavaScriptCore 框架如何将 JavaScript 对象转换为 Objective-C 对象,反之亦然?桥接器是否使用相同的二进制协议(protocol)来对两种目标语言进行通信? 最佳答
JavaScriptCore 框架如何将 JavaScript 对象转换为 Objective-C 对象,反之亦然?桥接器是否使用相同的二进制协议(protocol)来对两种目标语言进行通信? 最佳答
我在我们的应用程序上添加了一个 webview 实例。但是,有时会发生崩溃。 调用堆栈上的崩溃称为 JavaScriptCore WTFCrash。 Crashed: com.apple.main-t
在终端上运行 jsc 命令时,我可以访问函数 print()。它只是记录到标准输出。 我正在构建一个框架,以使 JS 库可以用 C 语言使用,当我的 JS 源尝试调用 print() 时,会引发异常。
JSC seems like the simpler-and-easier ,更便携,和准通用安装 - 世界上 node.js 的明显替代品......我已经能够弄清楚基础知识,但几乎没有关于它的东西
我有一个由 javascript 使用 JavascriptCore 调用的函数。现在,在该函数内,我必须在特定条件下再次评估 javascript。这应该调用相同的函数。 let My_JS_Fun
我正在尝试为 iOS 使用 JavascriptCore 框架,但我遇到了问题。 我的简单 javascript 文本: NSString * jsCode = @"var log = require
我正在开发一个 js 库,它也应该可以被 react-native 项目使用。 react-native 使用的 javascript 引擎是 JavaScriptCore,它与浏览器中使用的 nod
https://github.com/gg2001/monero/blob/master/monero/NewWallet.js 我有一个相当大的 6000 行 js 文件,JavaScript 核心
我正在尝试使用 JavaScriptCore C API 开发一个简单的 cli 工具示例(在我的 linux 机器上使用,或者如果不可能在 mac osx 上使用它)。参数是 JavaScript
我是一名优秀的程序员,十分优秀!