gpt4 book ai didi

JavascriptCore:在 JSExport 中将 javascript 函数作为参数传递

转载 作者:可可西里 更新时间:2023-11-01 05:29:11 31 4
gpt4 key购买 nike

JavascriptCore 是iOS7 支持的新框架。我们可以使用 JSExport 协议(protocol)将部分 objc 类暴露给 JavaScript。

在 javascript 中,我尝试将函数作为参数传递。就像这样:

function getJsonCallback(json) {
movie = JSON.parse(json)
renderTemplate()
}
viewController.getJsonWithURLCallback("", getJsonCallback)

在我的 objc viewController 中,我定义了我的协议(protocol):

@protocol FetchJsonForJS <JSExport>
- (void)getJsonWithURL:(NSString *)URL
callback:(void (^)(NSString *json))callback;
- (void)getJsonWithURL:(NSString *)URL
callbackScript:(NSString *)script;
@end

在 javascript 中,viewController.getJsonWithURLCallbackScript 有效,但是,viewController.getJsonWithURLCallback 无效。

我在 JSExport 中使用 block 有什么错误吗?谢谢。

最佳答案

问题是您已将回调定义为一个接受 NSString arg 的 Objective-C block ,但 javascript 不知道如何处理它并在您尝试评估 viewController.getJsonWithURLCallback("", getJsonCallback) 时产生异常- 它认为第二个参数的类型是'undefined'

相反,您需要将回调定义为 javascript 函数。

您可以在 Objective-C 中简单地使用 JSValue 来做到这一点。

对于那里的其他读者,这里有一个完整的工作示例(带有异常处理):

TestHarnessViewController.h:

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

@protocol TestHarnessViewControllerExports <JSExport>
- (void)getJsonWithURL:(NSString *)URL callback:(JSValue *)callback;
@end

@interface TestHarnessViewController : UIViewController <TestHarnessViewControllerExports>
@end

TestHarnessViewController.m:(如果使用复制/粘贴,请删除 evaluateScript 中的换行符 - 这些是为清楚起见而添加的):

#import "TestHarnessViewController.h"

@implementation TestHarnessViewController {
JSContext *javascriptContext;
}

- (void)viewDidLoad
{
[super viewDidLoad];

javascriptContext = [[JSContext alloc] init];
javascriptContext[@"consoleLog"] = ^(NSString *message) {
NSLog(@"Javascript log: %@",message);
};
javascriptContext[@"viewController"] = self;

javascriptContext.exception = nil;
[javascriptContext evaluateScript:@"
function getJsonCallback(json) {
consoleLog(\"getJsonCallback(\"+json+\") invoked.\");
/*
movie = JSON.parse(json);
renderTemplate();
*/
}

viewController.getJsonWithURLCallback(\"\", getJsonCallback);
"];
JSValue *e = javascriptContext.exception;
if (e != nil && ![e isNull])
NSLog(@"Javascript exception occurred %@", [e toString]);
}

- (void)getJsonWithURL:(NSString *)URL callback:(JSValue *)callback {
NSString *json = @""; // Put JSON extract from URL here
[callback callWithArguments:@[json]];
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end

关于JavascriptCore:在 JSExport 中将 javascript 函数作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22607140/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com