objective-c - 如何将 JavaScript 回调函数传递给 Cocoa/Obj-C?

标签 objective-c cocoa

我正在尝试在 WebView 中传递来自 JavaScript 的函数引用,这样我的 Objective-C 代码就可以在异步 Obj-C 方法完成时调用然后返回该函数。我看到了如何传递简单类型——字符串、数字等——但似乎无法弄清楚如何传递函数引用,比如

window.myRootObject.myObjCSelector("some-string", function(data) { 
  console.log(data); 
});

我用 Google 搜索了一下,但仍然找不到答案,并且(还)没有在文档中找到对此的引用。在 Cocoa 工作,但希望能够在 iOS 上做同样的事情。

在此先感谢您的帮助!

编辑:函数参数应该是匿名的——希望这能澄清。 :)

最佳答案

终于明白了。可能有更好的方法(如果是这样,请插话!)但以下方法似乎有效。在我的 Obj-C(NSObject-derived)类中——我向其中传递了一个对 WebView 的引用——我定义了以下脚本可访问的方法:

#import <WebKit/WebKit.h>
#import <JavaScriptCore/JavaScriptCore.h>

- (void) search:(NSString *)prefix withCallback:(WebScriptObject *)callback;

... 旨在采用两个参数:一个用于搜索的字符串,以及一个处理结果的匿名回调函数。它是这样实现的:

- (void) search:(NSString *)prefix withCallback:(WebScriptObject *)callback
{
  // Functions get passed in as WebScriptObjects, which give you access to the function as a JSObject
  JSObjectRef ref = [callback JSObject];

  // Through WebView, you can get to the JS globalContext
  JSContextRef ctx = [[view mainFrame] globalContext];

  // In my case, I have a JSON string I want to pass back into the page as a JavaScript object
  JSValueRef obj = JSValueMakeFromJSONString(ctx, JSStringCreateWithCFString((__bridge CFStringRef)responseString)); 

  // And here's where I call the callback and pass in the JS object
  JSObjectCallAsFunction(ctx, ref, NULL, 1, &obj, NULL);
}

这实际上也是异步工作的,通过 Objective-C block ,但要点在上面。希望对其他人有帮助!

关于objective-c - 如何将 JavaScript 回调函数传递给 Cocoa/Obj-C?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10197587/

相关文章:

ios - 尝试将 iOS 应用程序与 SIP 连接

ios - ( objective-c )方法和变量如果只在自己的类中使用,是否需要在头文件(.h)中声明?

objective-c - Finder 脚本桥接关闭

swift - 当应用处于事件状态时显示 NSUserNotification

swift - 私有(private)函数: Missing argument for parameter #1 in call

ios - 如何通过使用自动布局显示和隐藏组件来调整 UITableViewCell 的高度

objective-c - GC 应用程序可以链接到 ARC 框架吗?

cocoa - 如何在 Cocoa NSTableView 中添加列?

iphone - 为什么没有 NSHTTPURLProtocol 类?

objective-c - 正确使用ARC(自动引用计数)?