最近遇到一個Object-C與JavaScript相互調(diào)用的問題處理方式如下:
注意:一定要寫對H5中的方法名
舉例說明:
- ViewController.h文件
#import <UIKit/UIKit.h>
#import <JavaScriptCore/JavaScriptCore.h>
@protocol JSObjcDelegate <JSExport>
//對象調(diào)用的JavaScript方法删豺,必須聲明!7兑ā楚殿!
- (void)call1;
- (void)getCall:(NSString *)callString;
@end
@interface ViewController : UIViewController<UIWebViewDelegate,JSObjcDelegate>
@property (nonatomic, strong) JSContext *jsContext;
@property (strong, nonatomic) UIWebView *webView;
@end
- ViewController.m文件
#import "ViewController.h"
@interface ViewController ()
@property(nonatomic,copy)NSString * JSName;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 20, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)];
self.webView.delegate = self;
//從本地加載html文件
NSString* path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"];
NSURL* url = [NSURL fileURLWithPath:path];
NSURLRequest* request = [NSURLRequest requestWithURL:url] ;
[self.webView loadRequest:request];
[self.view addSubview:self.webView];
}
//JavaScript的tianbai是一個對象,充當(dāng)原生應(yīng)用和web頁面之間的一個橋梁笋轨。用來調(diào)用方法
//webview加載完成調(diào)用代理
- (void)webViewDidFinishLoad:(UIWebView *)webView {
// 設(shè)置javaScriptContext上下文
self.jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//將tianbai對象指向自身
self.jsContext[@"baoming"] = self;
self.jsContext.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) {
context.exception = exceptionValue;
NSLog(@"異常信息:%@", exceptionValue);
};
}
//將對象指向自身后穿扳,如果調(diào)用 tianbai.call() 會響應(yīng)下面的方法怀泊,OC方法中調(diào)用js中的Callback方法躯畴,并傳值
- (void)call1{
NSString * str = self.JSName;
JSValue *openLogin = self.jsContext[str];
//獲取包名
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
NSString * bildName = [infoDictionary objectForKey:@"CFBundleDisplayName"];
//傳值給web端
[openLogin callWithArguments:@[bildName]];
}
//將對象指向自身后民鼓,如果調(diào)用 tianbai.getCall(callInfo) 會響應(yīng)下面的方法,OC方法中僅調(diào)用JavaScript中的alerCallback方法
- (void)getCall:(NSString *)callString{
self.JSName = callString;
[self call1];
NSLog(@"Get:%@", callString);
// 成功回調(diào)JavaScript的方法Callback
// JSValue *Callback = self.jsContext[@"alerCallback"];
// [Callback callWithArguments:nil];
}
//將對象指向自身后蓬抄,還可以向html注入js
- (void)alert{
// 直接添加提示框
NSString *str = @"alert('OC添加JS提示成功')";
[self.jsContext evaluateScript:str];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
3.HTML文件
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<div style="margin-top: 20px">
<h2>JS與OC交互</h2>
<input type="button" value="喚起本地方法(call)" onclick="baoming.call()">
</div>
<div>
<input type="button" value="喚起getCall:(NSString *)callString傳值" onclick="call()">
</div>
<div>
<input type="button" value="包名" onclick="call1()">
</div>
<script>
var call1 = function()
{
var callInfo = {"jianshu": "http://www.reibang.com/users/55c8fdc3c6e7/latest_articles", "ceshi": "data111"};
tianbai.getCall(callInfo);
}
var Callback = function(str)
{
alert(str);
}
var openLogin = function(str)
{
alert(str);
}
var alerCallback = function()
{
alert('成功');
}
</script>
</body>
</html>