在本系列交互文章中,第一篇的第二種方法已經(jīng)簡單介紹過使用的方式了巢掺,這里再單獨(dú)拎出來補(bǔ)充以下細(xì)節(jié)句伶。
(以下步驟劲蜻,因?yàn)槭前阎暗奈恼卵a(bǔ)充以下,所以步驟大致相同考余,了解可跳過先嬉。)
1.html文件及編譯環(huán)境配置
JavaScriptCore庫的導(dǎo)入
2.加載UIWebView
self.webView = [[UIWebView alloc] initWithFrame:self.view.frame];
self.webView.delegate = self;
NSURL *htmlURL = [[NSBundle mainBundle] URLForResource:@"index.html" withExtension:nil];
// NSURL *htmlURL = [NSURL URLWithString:@"http://www.baidu.com"];
NSURLRequest *request = [NSURLRequest requestWithURL:htmlURL];
在UIWebViewDelegate方法中,頁面結(jié)束加載后開始進(jìn)行交互操作
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
[self addCustomActions]; // UIWebview加載結(jié)束后開始進(jìn)行交互
}
3.交互操作
JSContext是為JavaScript的執(zhí)行提供運(yùn)行環(huán)境楚堤,所有的JavaScript的執(zhí)行都必須在JSContext環(huán)境中疫蔓。JSContext也管理JSVirtualMachine中對象的生命周期。每一個(gè)JSValue對象都要強(qiáng)引用關(guān)聯(lián)一個(gè)JSContext身冬。當(dāng)與某JSContext對象關(guān)聯(lián)的所有JSValue釋放后衅胀,JSContext也會被釋放。
獲取JSContext有多種方式酥筝,這里先使用這一種滚躯。
- (void)addCustomActions
{
// 拿到context
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
// [context evaluateScript:@"var arr = [3, 4, 'abc'];"];
[self addScanWithContext:context];
[self addLocationWithContext:context];
[self addSetBGColorWithContext:context];
[self addShareWithContext:context];
[self addPayActionWithContext:context];
[self addShakeActionWithContext:context];
[self addGoBackWithContext:context];
}
OC調(diào)用JS方法有多種。
方式一
使用JSContext的方法-evaluateScript嘿歌,可以實(shí)現(xiàn)OC調(diào)用JS方法掸掏。
- (void)addShareWithContext:(JSContext *)context
{
context[@"share"] = ^() {
NSArray *args = [JSContext currentArguments]; // 獲取參數(shù)列表
if (args.count < 3) {
return ;
}
NSString *title = [args[0] toString];
NSString *content = [args[1] toString];
NSString *url = [args[2] toString];
// 在這里執(zhí)行分享的操作
// 將分享結(jié)果返回給js
NSString *jsStr = [NSString stringWithFormat:@"shareResult('%@','%@','%@')",title,content,url];
// 使用[JSContext currentContext]而不是self.context來在block中使用JSContext,來防止循環(huán)引用搅幅。
[[JSContext currentContext] evaluateScript:jsStr];
};
}
方式二
使用JSValue的方法-callWithArguments阅束,也可以實(shí)現(xiàn)OC調(diào)用JS方法。
示例
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
[context[@"payResult"] callWithArguments:@[@"支付彈窗"]];
方法中實(shí)際使用茄唐,在執(zhí)行原生OC方法之后息裸,想要在OC執(zhí)行完操作后,將結(jié)果回調(diào)給JS時(shí)沪编。
- (void)addPayActionWithContext:(JSContext *)context
{
context[@"payAction"] = ^() {
NSArray *args = [JSContext currentArguments];
if (args.count < 4) {
return ;
}
NSString *orderNo = [args[0] toString];
NSString *channel = [args[1] toString];
long long amount = [[args[2] toNumber] longLongValue];
NSString *subject = [args[3] toString];
// 支付操作
NSLog(@"orderNo:%@---channel:%@---amount:%lld---subject:%@",orderNo,channel,amount,subject);
// 將支付結(jié)果返回給js
// NSString *jsStr = [NSString stringWithFormat:@"payResult('%@')",@"支付成功"];
// [[JSContext currentContext] evaluateScript:jsStr];
[[JSContext currentContext][@"payResult"] callWithArguments:@[@"支付成功"]];
};
}
關(guān)于JavaScriptCore的使用方法呼盆,簡單介紹到這里。關(guān)于JavaScriptCore庫的詳細(xì)介紹蚁廓,之后再整理访圃。