我正在尝试使用 的数字格式化程序Intl,它在 iOS 上完美运行,并且当调试器连接到 iOS 或 Android 时,但由于 Android 中的 JSC 过时,仅在没有连接调试器的情况下在 Android 上失败。
经过一番研究,我发现了两种可能的解决方案:
IntlpolyfillIntl在安装intl和react-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)
我刚刚在iOS7中发现了一个新的框架:JavaScriptCore.
它看起来很棒,但是如何访问运行时/上下文UIWebView?
不确定我是否遇到了一个错误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) 我正在尝试使用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不支持的功能吗?(文档 …
我正在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是否有任何新的可能性来实现同样的目标.
我目前正在尝试在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) 我一直试图弄清楚如何在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) 我在一个创建多个 JSContext 的框架上工作。我已经通过覆盖维护对它们的引用的类中的“dealloc”方法来确认它们正在被释放。我还使用 Instruments 中的 Allocations 工具分析了我的应用程序,并确认在整个应用程序的生命周期中没有反复出现的内存堆栈。然而,这些 JSContext 的内存使用目前是一个争论点。
我基本上是想确认一些事情:
提前感谢您的任何见解。
我正在尝试.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) 我有一个 Rust 库,它公开了可通过 C 调用的 FFI。我希望能够通过为 Android 构建本机模块来在 React Native 中使用它。
我正在寻找jnr-ffi构建本机模块,但文档不是很清楚。
有人可以指导我这样的事情如何运作吗?还有其他选择吗?例如node-ffi,对于react-native,我根本不需要构建本机模块?
javascriptcore ×10
ios ×6
swift ×4
javascript ×2
memory-leaks ×2
objective-c ×2
react-native ×2
webkit ×2
android ×1
block ×1
cocoa ×1
ecmascript-6 ×1
ffi ×1
heap-memory ×1
instruments ×1
ios7 ×1
macos ×1
polyfills ×1
react-intl ×1
uiwebview ×1
webassembly ×1
wkwebview ×1