使用JSContextfrom a a UIWebView创建了一个作为Objective C块实现的javascript函数:
JSContext *js = ... //get contect from web view
js[@"aFunc"] = ^(JSValue *aString, JSValue *callback) {
NSString *realString = [aString toString];
MyOperation *op = [[MyOperation alloc] initWithString:realString andCallback:callback];
//Do some heavy lifting in background
[self.myQueue addOperation:op];
}
Run Code Online (Sandbox Code Playgroud)
此函数将回调作为参数,并NSOperationQueue在调用回调之前执行一些工作,如:
- (void)main {
JSValue *arg = [self theHeavyWork];
//Now we have finished the heavy work, switch back to main thread to run callback (if any).
if ([self.callback isObject] != NO) {
dispatch_async(dispatch_get_main_queue(), …Run Code Online (Sandbox Code Playgroud) 我正在使用iOS 7中引入的JavaScriptCore框架.我的应用程序具有iOS 6.0部署目标.我正在将应用程序与JavaScriptCore.framework链接(默认情况下在所需模式下).新的JavaScript的Objective-C类(JSContext,JSValue在iOS 6上运行时,但我仍然可以使用普通的C API,即等)显然不能提供JSGlobalContextCreate(),JSObjectCallAsFunction()等等.
如果我链接在iOS 7中引入的MultipeerConnectivity框架并且我在iOS 6上运行我的应用程序,我在启动时会遇到预期的崩溃:
dyld: Library not loaded: /System/Library/Frameworks/MultipeerConnectivity.framework/MultipeerConnectivity
Referenced from: /var/mobile/Applications/5AB83411-CEFC-437D-88F8-6B80C36CCE9F/MyApp.app/MyApp
Reason: image not found
Run Code Online (Sandbox Code Playgroud)
当我链接JavaScriptCore框架时,为什么我的应用程序没有崩溃同样的dyld错误?
我一直试图弄清楚如何在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) 我有一个类,其方法和属性使用JSExport导出.在正常情况下,它运作良好.但是如果属性是某个内部类的类型,则无法从javascript访问它.
以下是我正在使用的课程:
Person.swift
import Foundation
import JavaScriptCore
@objc
protocol PersonJavaScritMethod : JSExport {
var testProperty : OuterClassPersonal.Personal? { get set }
func sayHello(name1:String)
}
class Person : NSObject, PersonJavaScritMethod {
var name : String!
var testProperty:OuterClassPersonal.Personal?
init(name:String) {
testProperty = OuterClassPersonal.Personal()
super.init()
self.name = name
}
class func create(name : String) -> Person {
return Person(name: name)
}
func sayHello(name1:String) {
println("Hello \(name) \(name1)")
}
}
Run Code Online (Sandbox Code Playgroud)
Personal.swift
import Foundation
import JavaScriptCore
@objc
protocol PersonalJavaScritMethod : JSExport {
func getNNN()
} …Run Code Online (Sandbox Code Playgroud) 我在iOS应用程序中使用JavaScriptCore库,我正在尝试实现setTimeout函数.
setTimeout(func, period)
Run Code Online (Sandbox Code Playgroud)
启动应用程序后,将创建具有全局上下文的JSC引擎,并向该上下文添加两个函数:
_JSContext = JSGlobalContextCreate(NULL);
[self mapName:"iosSetTimeout" toFunction:_setTimeout];
[self mapName:"iosLog" toFunction:_log];
Run Code Online (Sandbox Code Playgroud)
这是本机实现,它将具有所需名称的全局JS函数映射到静态目标C函数:
- (void) mapName:(const char*)name toFunction:(JSObjectCallAsFunctionCallback)func
{
JSStringRef nameRef = JSStringCreateWithUTF8CString(name);
JSObjectRef funcRef = JSObjectMakeFunctionWithCallback(_JSContext, nameRef, func);
JSObjectSetProperty(_JSContext, JSContextGetGlobalObject(_JSContext), nameRef, funcRef, kJSPropertyAttributeNone, NULL);
JSStringRelease(nameRef);
}
Run Code Online (Sandbox Code Playgroud)
这里是目标C setTimeout函数的实现:
JSValueRef _setTimeout(JSContextRef ctx,
JSObjectRef function,
JSObjectRef thisObject,
size_t argumentCount,
const JSValueRef arguments[],
JSValueRef* exception)
{
if(argumentCount == 2)
{
JSEngine *jsEngine = [JSEngine shared];
jsEngine.timeoutCtx = ctx;
jsEngine.timeoutFunc = (JSObjectRef)arguments[0];
[jsEngine performSelector:@selector(onTimeout) withObject:nil afterDelay:5];
}
return JSValueMakeNull(ctx);
}
Run Code Online (Sandbox Code Playgroud)
一段延迟后应该在jsEngine上调用的函数:
- …Run Code Online (Sandbox Code Playgroud) 免责声明:这是一个很长的帖子,但对于那些使用新的ObjectiveC JavascriptCore框架并在ObjC和JS之间进行异步编码的人来说,这可能非常有价值.
大家好,我是Objective C的新手,我正在将一个javascript通信库集成到我的iOS应用程序中.
无论如何,我一直在尝试使用iOS7中引入的新ObjectiveC JavaScriptCore框架.它在很大程度上非常棒,尽管到目前为止记录很差.
混合语言惯例真的很奇怪,但在某些方面也有点解放.
我应该补充一点,我当然正在使用ARC,因此这有助于从Javascript世界中获得很多.但是在ObjectiveC和JSContext callBacks之间移动时,我有一个非常具体的内存使用问题.就像我在Javascript中执行一个函数,然后执行一些异步代码,然后回调到一个定义的ObjectiveC块,然后调用一个定义的JS回调......我只是想确保我做得对(即一些地方没有泄漏记忆)!
只是为了做正确的事情(因为我引用了一个类self来调用ObjectiveC callBacks我创建了一个weakSelf所以它对ARC很好用(从问题中引用:在这个块中强烈捕获self可能会导致保留周期):
__unsafe_unretained typeof(self) weakSelf = self;
Run Code Online (Sandbox Code Playgroud)
现在,说我有一个JSContext并添加一个功能.我希望这个函数接受一个callBack函数并以"Hello"作为参数调用它,并将另一个函数作为callBack传递.即.
// Add a new JSContext.
JSContext context = [[JSContext alloc] initWithVirtualMachine:[[JSVirtualMachine alloc] init]];
// Add a function to the context. This function takes a callBack function and calls it back with "Hello"
[context evaluateScript: @"var functionA = function(callBack){
var aMessage = "Foo";
callBack(aMessage, function(message){
/* message should say: Foo Bar */
});
}" …Run Code Online (Sandbox Code Playgroud) objective-c objective-c-blocks automatic-ref-counting javascriptcore ios7
我有一个Swift对象,我正在向JavaScriptCore公开,如下所示:
@objc(MyObjectExport) protocol MyObjectExport:JSExport {
var name:String {get set}
var dict:[String:String] {get set} }
class MyObject:NSObject,MyObjectExport {
var name:String="Name"
var dict:[String:String]=["test":"TEST"] }
Run Code Online (Sandbox Code Playgroud)
在Javascript上下文中,我可以愉快地获取并设置MyObject实例的'name'属性,但只能获取(而不是设置)'dict'字典项.
我错过了什么,或者这是一个错误?
iOS中的异常堆栈跟踪似乎只包含方法名称或存在错误。下面是我在 JSContext 中处理异常的代码。
context.exceptionHandler = { (ctx: JSContext!, value: JSValue!) in
// type of String
let stacktrace = value.objectForKeyedSubscript("stack").toString()
// type of Number
let lineNumber = value.objectForKeyedSubscript("line")
// type of Number
let column = value.objectForKeyedSubscript("column")
let moreInfo = "in method \(stacktrace)Line number in file: \(lineNumber), column: \(column)"
Logger.error("JS ERROR: \(value) \(moreInfo)")
}
Run Code Online (Sandbox Code Playgroud)
我得到了如下日志
ERROR : JSContextRenderer.swift:308 : setupContext : JS ERROR: Error in method clearBackground
Line number in file: 162, column: 12"
Run Code Online (Sandbox Code Playgroud)
请注意,在“clearBackground”名称之后有一个新行,我认为那里可能有更多信息。
有类似经历的人可以证实一下吗?任何帮助表示赞赏。谢谢。
我正在使用JavascriptCode框架编写iOS应用程序(使用xcode 7.3和swift 2.2).从swift调用javascript方法是完美的,但是当我从javascript调用swift方法时,xcode只显示一个"加载"类型的符号,没有任何反应.我需要"强制退出"xcode才能摆脱这种状态.我已经关注https://www.raywenderlich.com/124075/javascriptcore-tutorial和http://nshipster.com/javascriptcore/,我正在尝试非常简单的电话.
有没有人遇到过这种问题?
我的快捷代码如下:
@objc protocol WindowJSExports : JSExport {
var name: String { get set }
func getName() -> String
static func createWindowWithName(name: String) -> WindowJS
}
@objc class WindowJS : NSObject, WindowJSExports {
dynamic var name: String
init(name: String) {
self.name = name
}
class func createWindowWithName(name: String) -> WindowJS {
return WindowJS(name: name)
}
func getName() -> String {
NSLog("getName called from JS context")
return "\(name)"
}
}
Run Code Online (Sandbox Code Playgroud)
我正在初始化上下文如下:
runContext = JSContext() …Run Code Online (Sandbox Code Playgroud) 当应用程序未处于调试模式时,可以默认使用V8而不是JavascriptCore吗?
我在JavascriptCore中发现了一些问题,而不是在V8中发现了一些问题,这令人讨厌
谢谢。
javascriptcore ×10
ios ×5
swift ×5
javascript ×2
objective-c ×2
block ×1
dictionary ×1
hang ×1
ios7 ×1
iphone ×1
react-native ×1
reactjs ×1
v8 ×1
xcode ×1