标签: javascriptcore

在 Android React Native 应用程序中正确使用 Intl

我正在尝试使用 的数字格式化程序Intl,它在 iOS 上完美运行,并且当调试器连接到 iOS 或 Android 时,但由于 Android 中的 JSC 过时,仅在没有连接调试器的情况下在 Android 上失败。

经过一番研究,我发现了两种可能的解决方案:

  • 使用Intlpolyfill
  • 在 Android 中使用自定义 JSC

Intl在安装intlreact-intl使用纱线后,我首先像这样尝试了polyfill :

//in my app's index.js
if (!global.Intl) {
    global.Intl = require('intl');
}
Run Code Online (Sandbox Code Playgroud)

虽然它仍然说ReferenceError: Can't find variable: Intl

然后我放弃并尝试包含自定义 JSC(我已经确认正确引用了自定义 AAR),尽管我仍然遇到相同的错误。无论我做什么,我都无法Intl在没有附加调试器的情况下在 Android 上运行。

我究竟做错了什么?(我使用的是 React Native 0.59.9)

android polyfills javascriptcore react-native react-intl

11
推荐指数
4
解决办法
9233
查看次数

访问UIWebView的JavaScriptCore引擎

我刚刚在iOS7中发现了一个新的框架:JavaScriptCore.

它看起来很棒,但是如何访问运行时/上下文UIWebView

objective-c uiwebview ios javascriptcore

9
推荐指数
1
解决办法
7884
查看次数

使用WKScriptMessageHandler时内存泄漏

不确定我是否遇到了一个错误WebKit或我正在做一些可怕的错误,但我无法弄清楚如何使用WKScriptMessageHandler而不会导致WKScriptMessage.body泄漏中包含的任何值.

我能够组建一个最小的Mac项目来隔离问题,但无济于事.

在主视图控制器中:

class ViewController: NSViewController {
  var webView: WKWebView?

  override func viewDidLoad() {
    super.viewDidLoad()
    let userContentController = WKUserContentController()
    userContentController.addScriptMessageHandler(self, name: "handler")
    let configuration = WKWebViewConfiguration()
    configuration.userContentController = userContentController
    webView = WKWebView(frame: CGRectZero, configuration: configuration)
    view.addSubview(webView!)

    let path = NSBundle.mainBundle().pathForResource("index", ofType: "html")
    let url = NSURL(fileURLWithPath: path!)!
    webView?.loadRequest(NSURLRequest(URL: url))
  }
}

extension ViewController: WKScriptMessageHandler {
  func userContentController(userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage) {
     print(message.body)
   }
}
Run Code Online (Sandbox Code Playgroud)

然后在index.html文件中:

<html>
  <head></head>
  <body>
    <script type="text/javascript">
      webkit.messageHandlers.handler.postMessage("Here's …
Run Code Online (Sandbox Code Playgroud)

macos memory-leaks webkit ios javascriptcore

9
推荐指数
2
解决办法
3311
查看次数

如何在Swift的JavaScriptCore中导入模块?

我正在尝试使用Swift的JavaScriptCore框架来利用使用ES6模块的现有JavaScript库.特别是斯蒂芬·C·菲利普斯的莫尔斯职业选手.我已将文件添加到Xcode游乐场,然后使用此代码加载库并在JavaScript上下文中运行它:

import JavaScriptCore
var jsContext = JSContext()
// set up exception handler for javascript errors
jsContext?.exceptionHandler = { context, exception in
    if let exc = exception {
        print("JS Exception:", exc.toString())
    }
}
// read the javascript files in and evaluate
if let jsSourcePath = Bundle.main.path(forResource: "morse-pro-master/src/morse-pro-message", ofType: "js") {
    do {
        let jsSourceContents = try String(contentsOfFile: jsSourcePath)
        jsContext?.evaluateScript(jsSourceContents)
    } catch {
        print(error.localizedDescription)
    }
}
Run Code Online (Sandbox Code Playgroud)

这种方法适用于简单的"Hello world"类测试,但是它在morse-pro库中遇到了这个JavaScript错误:

SyntaxError:意外的标记'*'.import call只需要一个参数.

该错误似乎是由morse-pro-message.js中的这一行引起的:

import * as Morse from './morse-pro';
Run Code Online (Sandbox Code Playgroud)

我相信它试图将所有morse-pro文件作为模块导入.

我不熟悉ES6模块,但该库似乎适用于普通JavaScript环境中的其他人.我在Swift中加载库的方式有问题吗?或者模块是JavaScriptCore不支持的功能吗?(文档 …

javascript ios javascriptcore ecmascript-6 swift

9
推荐指数
2
解决办法
2148
查看次数

使用ViewControllers中iOS 7中的JavaScriptCore从javascript触发目标C方法

我正在webview中加载一个url,其中包含HTML和javascript函数调用.现在我正在研究用户触摸webview中的提交按钮时它应该调用viewController中的任何方法.Webview应该加载url(webview委托)是一种方法,但有任何新的方法来获取知道什么时候webview调用javascript函数应该通知viewcontroller或触发视图控制器中的任何方法.

我不是在寻找这个我们需要的解决方案

 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{

    NSLog(@"passed data from web view : %@",[[request URL] query]);

    if([[[request URL] query] isEqualToString:@"clickedOnLineNo"])
    {
//Do your action here

    }
Run Code Online (Sandbox Code Playgroud)

我们必须从你的javascript方法导航到假URL,比如

window.location = "someLink://yourApp/form_Submitted:param1:param2:param3";  
Run Code Online (Sandbox Code Playgroud)

点击按钮或您需要的操作.

但JavaScriptCore是否有任何新的可能性来实现同样的目标.

javascript objective-c ios javascriptcore ios7

8
推荐指数
1
解决办法
1万
查看次数

使用后台线程中的数据执行回调后,JavacriptCore WebKit EXC_BAD_ACCESS崩溃

我目前正在尝试在JavascriptCore接口的JavascriptCore实现中调试崩溃,以便本机代码代表WebView中的javascript代码执行一些工作.

崩溃有时会在启动应用程序后很快发生,有时可能需要几分钟才能执行数百次对本机代码的调用.

这些是每次崩溃回溯的前两行:

(lldb) thread backtrace
* thread #1: tid = 0x37960c, 0x00007fff8de6ecca JavaScriptCore`sanitizeStackForVMImpl + 15, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=2, address=0x700001a2c000)
    frame #0: 0x00007fff8de6ecca JavaScriptCore`sanitizeStackForVMImpl + 15
Run Code Online (Sandbox Code Playgroud)

这是我的视图控制器的简化版本:

class MyViewController: NSViewController, WebFrameLoadDelegate {

    let worker = Worker() 

    // other setup code...

    func webView(webView: WebView!, didCreateJavaScriptContext context: JSContext!, forFrame frame: WebFrame!) {
        context.setObject(worker, forKeyedSubscript: "ClientWorker")
    }
}
Run Code Online (Sandbox Code Playgroud)

JSExport协议本身,以及执行代码的实现工作.为了测试,我删除了实际的工作,只返回一个带有虚拟数据的字典,崩溃仍然发生.

@objc protocol WorkerJSExports: JSExport {
    func doWork(params: [String:AnyObject], callback: JSValue)
}

@objc class Worker: NSObject, WorkerJSExports {

    func doWork(params: …
Run Code Online (Sandbox Code Playgroud)

cocoa webkit grand-central-dispatch javascriptcore swift

8
推荐指数
0
解决办法
663
查看次数

Swift块不工作

我一直试图弄清楚如何在swift中使用JavaScriptCore.我遇到了问题但是当我必须处理块作为参数时,似乎立即运行块并且参数获取块的返回值.我究竟做错了什么?

工作目标C代码:

JSContext* context = [[JSContext alloc] initWithVirtualMachine:[[JSVirtualMachine alloc] init]];
context[@"test"] = ^(NSString *string) {
    //code
};
Run Code Online (Sandbox Code Playgroud)

我尝试过的:

1:

var ctx = JSContext(virtualMachine:JSVirtualMachine())
var ctx["test"] = {(string:NSString)->() in /*code*/ }

//Gives me "'JSContext' does not have a member named 'subscript'"
Run Code Online (Sandbox Code Playgroud)

2:

var ctx = JSContext(virtualMachine:JSVirtualMachine())
let n: (string: String)->() = {string in /*code*/}

ctx.setObject(n, forKeyedSubscript:"test")

//Gives me "Type '(x: String) -> () does not conform to protocol 'AnyObject'"
Run Code Online (Sandbox Code Playgroud)

3:

var ctx = JSContext(virtualMachine:JSVirtualMachine())
let n: (string: String)->() = {string in …
Run Code Online (Sandbox Code Playgroud)

block javascriptcore swift

7
推荐指数
1
解决办法
4114
查看次数

JavaScriptCore 内存分析

我在一个创建多个 JSContext 的框架上工作。我已经通过覆盖维护对它们的引用的类中的“dealloc”方法来确认它们正在被释放。我还使用 Instruments 中的 Allocations 工具分析了我的应用程序,并确认在整个应用程序的生命周期中没有反复出现的内存堆栈。然而,这些 JSContext 的内存使用目前是一个争论点。

我基本上是想确认一些事情:

  1. 原生层和 JS 层是否有单独的堆?
  2. 如果有,Instruments 工具在查看“All Heap & Anonymous VM”时是否将两者都考虑在内?
  3. 如果没有,有没有办法使用 Instruments 来分析 JS 堆?
  4. 如果没有,使用真实设备分析 JS 堆的最佳方法是什么?

提前感谢您的任何见解。

memory-leaks heap-memory instruments ios javascriptcore

7
推荐指数
0
解决办法
606
查看次数

如何通过 WKWebVIew 或 JSC 在 iOS 应用程序中加载 WebAssembly

我正在尝试.wasm从基于 Swift 的 iOS 应用程序中加载和执行 WebAssembly 。我首先尝试使用JavaScriptCore 框架,但是WebAssembly.*当我尝试评估一个简单的脚本时,该模块在上下文中不可用。我能够确认WebAssembly未通过 Safari 调试器控制台定义。

然后我尝试使用 WKWebView,因为我相信缺乏WebAssembly是由于JSC 不支持WKWebView 应该支持的JIT。我得到了同样的结果。

这是一个在 iPhone X 12.4 模拟器、Xcode 10.3 和手动添加到项目的 WebKit 框架上运行的简单应用程序。确保打开 Safari 并为 WKWebView 调试器选择“Developer>Simulator”。

import UIKit
import WebKit

class ViewController: UIViewController {
    @IBOutlet weak var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    @IBAction func onClick(_ sender: UIButton) {
        let testWasm = """
            if(typeof WebAssembly !== 'undefined') {
                console.log("Hello, Wasm.");
            } else { …
Run Code Online (Sandbox Code Playgroud)

ios javascriptcore swift wkwebview webassembly

7
推荐指数
1
解决办法
3439
查看次数

如何在react-native中调用FFI函数

我有一个 Rust 库,它公开了可通过 C 调用的 FFI。我希望能够通过为 Android 构建本机模块来在 React Native 中使用它。

我正在寻找jnr-ffi构建本机模块,但文档不是很清楚。

有人可以指导我这样的事情如何运作吗?还有其他选择吗?例如node-ffi,对于react-native,我根本不需要构建本机模块?

ffi javascriptcore react-native

7
推荐指数
0
解决办法
837
查看次数