webview 用的是WKWebView代乃,需實(shí)現(xiàn)協(xié)議<WKScriptMessageHandler,WKNavigationDelegate,WKUIDelegate>
// js調(diào)用oc
// 原理
//1、JS與iOS約定好JStoOC方法擂橘,用作JS在調(diào)用iOS時(shí)的方法;
//2滑频、iOS使用WKUserContentController的-addScriptMessageHandler:name:方法監(jiān)聽name為JStoOC的消息;
//3彤避、iOS在-userContentController:didReceiveScriptMessage:方法中讀取name為JStoOC的消息數(shù)據(jù)message.body蒿褂。
關(guān)鍵代碼如下
// 初始化
- (instancetype)init
{
self = [super init];
if (self) {
WKWebViewConfiguration *config = [WKWebViewConfiguration new];
//初始化偏好設(shè)置屬性:preferences
config.preferences = [WKPreferences new];
//是否支持JavaScript, 默認(rèn)是yes ,也可以不設(shè)置
config.preferences.javaScriptEnabled = YES;
config.userContentController = [WKUserContentController new];
// 注入方法名是 "JStoOC"近速,可以在WKScriptMessageHandler代理中接收到j(luò)s的調(diào)用
[config.userContentController addScriptMessageHandler:self name:@"JStoOC"];
// frame 可以根據(jù)實(shí)際情況設(shè)置
_webView = [[WKWebView alloc]initWithFrame:CGRectMake(0, 0, 0,0) configuration:config];
_webView.UIDelegate = self;
_webView.navigationDelegate = self;
}
return self;
}
- (void)dealloc
{
// 注冊(cè)了方法崎场,一定要remove干厚,防止循環(huán)引用
[[self.webView configuration].userContentController removeScriptMessageHandlerForName:@"JStoOC"];
}
//WKScriptMessageHandler 協(xié)議的回調(diào)方法
-(void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
if ([message.name isEqualToString:@"JStoOC"]) {
// js 傳的參數(shù)在 message.body 里
// 執(zhí)行業(yè)務(wù)邏輯
// ...
}
}
// oc調(diào)用js
// 原理
//1谆扎、iOS與JS約定好OCtoJS方法,用作iOS在調(diào)用JS時(shí)的入口方法状土;
//2累驮、iOS在頁(yè)面加載完成 或者 js主動(dòng)調(diào)用oc注入方法需回傳參數(shù)場(chǎng)景
//3午绳、iOS使用WKWebView的-evaluateJavaScript:completionHandler:方法執(zhí)行拼接好的JS代碼;
//4抬伺、iOS通過completionHandler收到JS給OCtoJS方法的回調(diào)能岩。
// WKNavigationDelegate 協(xié)議的 回調(diào)方法,頁(yè)面加載完,調(diào)用js 方法
-(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
// 無(wú)參數(shù)場(chǎng)景
[webView evaluateJavaScript:@"OCtoJS()" completionHandler:^(id data, NSError * _Nullable error) {
// 調(diào)用js后, OC收到的回調(diào)方法
}];
}
補(bǔ)充一點(diǎn)近忙,這個(gè)是有參數(shù)的情況
// 這個(gè)地方需要注意,
-(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
// 方法名字及參數(shù)結(jié)構(gòu)
// OCtoJS({
// "businessFunctionName" : "tokenData(業(yè)務(wù)方法名字)",
// "param" : {
// "key1" : "value1",
// "key2" : "value2",
// }
// })
//
NSDictionary *paramDic = @{@"businessFunctionName":@"tokenData",@"param":@{@"key1":@"value1",@"key2":@"value2"}};
//轉(zhuǎn)為json
NSData *data = [NSJSONSerialization dataWithJSONObject:paramDic options:(NSJSONWritingPrettyPrinted) error:nil];
NSString *paramStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSString *jsonStr = [NSString stringWithFormat:@"OCtoJS(%@)",paramStr];
[webView evaluateJavaScript:jsonStr completionHandler:^(id data, NSError * _Nullable error) {
// 調(diào)用js后, OC收到的回調(diào)方法
}];
}