WKWebView与H5的js交互(含H5代码)

385 阅读1分钟

h5端:

import Vue from "vue";
import utils from "@/assets/js/utils";
import { Toast } from "vant";

Vue.use(Toast);
function callApp(name, androidData, iosData) {
    if (utils.judgeBrowser().android) {
        if (window.JSCallJava) {
            if (window.JSCallJava[name]) {
                if (androidData) {
                    window.JSCallJava[name](androidData);
                } else {
                    window.JSCallJava[name]();
                }
            }
        }
    } else if (utils.judgeBrowser().ios) {
        if (window.webkit && window.webkit.messageHandlers) {
            if (window.webkit.messageHandlers[name]) {
                if (iosData) {
                    window.webkit.messageHandlers[name].postMessage(iosData);
                } else {
                    window.webkit.messageHandlers[name].postMessage();
                }
            }
        }
    }
}
//约定的方法名
export function closePage() {
    callApp("closePage", "", "1");
}

iOS端

#import "JNDelegateCommonWebView.h"
#import <WebKit/WebKit.h>

@interface JNDelegateCommonWebView ()<WKNavigationDelegate, WKUIDelegate,WKScriptMessageHandler>
@property (nonatomic, strong) WKWebView *web;
@end

@implementation JNDelegateCommonWebView

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self createUI];
}
-(void)createUI{
    WKWebViewConfiguration *config = [WKWebViewConfiguration new];
    config.userContentController = [WKUserContentController new];
    //注册js方法
    [config.userContentController addScriptMessageHandler:self name: @"closePage"];
    
    self.web = [[WKWebView alloc]initWithFrame:CGRectZero configuration:config];
    _web.navigationDelegate = self;
    
    [self.view addSubview:_web];
}
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
    VLog(@"方法名:%@,传递的数据:%@",message.name,message.body);// 方法名
    if ([message.name isEqualToString:@"closePage"]) {
        [self.navigationController popViewControllerAnimated:YES];
    }
}
@end