标签: javascriptcore

调用[JSValue callWithArguments:]会在调用alert()时锁定UI

使用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)

objective-c ios javascriptcore

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

iOS上的JavaScriptCore框架可用性

我正在使用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错误?

ios javascriptcore

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

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
查看次数

如何使用JSExport导出内部类的方法

我有一个类,其方法和属性使用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 swift

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

iOS使用JavascriptCore实现"window.setTimeout"

我在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)

javascript iphone ios javascriptcore

6
推荐指数
1
解决办法
4110
查看次数

ObjectiveC和JavaScriptCore:使用这种调用CallBacks的方法会导致内存问题吗?

免责声明:这是一个很长的帖子,但对于那些使用新的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

6
推荐指数
1
解决办法
4521
查看次数

为什么我不能设置暴露给JavaScriptCore的Swift字典项?

我有一个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'字典项.

我错过了什么,或者这是一个错误?

dictionary ios javascriptcore swift

6
推荐指数
1
解决办法
191
查看次数

iOS JavascriptCore 异常详细的堆栈跟踪信息

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”名称之后有一个新行,我认为那里可能有更多信息。

有类似经历的人可以证实一下吗?任何帮助表示赞赏。谢谢。

javascriptcore swift

6
推荐指数
1
解决办法
2143
查看次数

从JavaScript调用swift方法会挂起xcode和应用程序

我正在使用JavascriptCode框架编写iOS应用程序(使用xcode 7.3和swift 2.2).从swift调用javascript方法是完美的,但是当我从javascript调用swift方法时,xcode只显示一个"加载"类型的符号,没有任何反应.我需要"强制退出"xcode才能摆脱这种状态.我已经关注https://www.raywenderlich.com/124075/javascriptcore-tutorialhttp://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)

xcode hang javascriptcore swift

6
推荐指数
1
解决办法
1184
查看次数

使用V8代替JavascriptCore进行react-native

当应用程序未处于调试模式时,可以默认使用V8而不是JavascriptCore吗?

我在JavascriptCore中发现了一些问题,而不是在V8中发现了一些问题,这令人讨厌

谢谢。

javascript v8 javascriptcore reactjs react-native

6
推荐指数
1
解决办法
2402
查看次数