iPh*_*nig 5 javascript ios javascriptcore swift
我正在尝试使用 JSCore 从 Swift 中的 javascript SDK 执行异步函数。我已经能够完成评估和查看脚本的内容,但在实际调用异步函数时并未成功。这是我的代码,用于验证我是否已阅读该脚本。关于如何实现这一目标有什么想法吗?
lazy var context: JSContext? = {
let context = JSContext()
guard let
commonJSPath = Bundle.main.path(forResource: "test", ofType: "js") else {
print("Unable to read resource files.")
return nil
}
do {
let common = try String(contentsOfFile: commonJSPath, encoding: String.Encoding.utf8)
_ = context?.evaluateScript(common)
} catch (let error) {
print("Error while processing script file: \(error)")
}
return context
}()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
setupJS()
}
func setupJS(){
guard let context = context else {
print("JSContext not found.")
return
}
let dictionary = context.objectForKeyedSubscript("MainObject").toDictionary()
print(dictonary)
//let script = "const {variableName} = FooJS;";
//let result = context.evaluateScript(script)
}
Run Code Online (Sandbox Code Playgroud)
我想做类似的事情async function doSomething(){ return 'hello world!'; }
console.log(await doSomething());
要从 swift 调用 javascript 函数:
context.objectForKeyedSubscript("functionName_in_Javascript_file").call(withArguments: [])
Run Code Online (Sandbox Code Playgroud)
为了将控制权交还给 swift,您可以定义一个从 javascript 调用的块,如下所示:
//someString 可能是您需要的 javascript 结果。
let swiftHandler: @convention(block) (String) -> Void = {(someString) in
//do something
}
Run Code Online (Sandbox Code Playgroud)
//使块可用于javasript,如下所示:
let swiftBlock = unsafeBitCast(swiftHandler, to: AnyObject.self)
context.setObject(swiftBlock, forKeyedSubscript: "swiftCallback" as (NSCopying & NSObjectProtocol)!)
Run Code Online (Sandbox Code Playgroud)
//最后在你的javascript文件中,当你获得你需要的结果时,只需使用你在上一步中给出的名称调用swift函数:
swiftCallback(result);
Run Code Online (Sandbox Code Playgroud)