1. 关于UIWebView 和嵌入的H5页面的交互(点击H5页面上的按钮,执行iOS原生方法)
在UIWebView 的webViewDidFinishLoad 方法中进行 webview 的JS注入
JSContext *content = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//此处的getMessage和JS方法中的getMessage名称一致.
content[@"getMessage"] = ^() {
NSArray*arguments = [JSContextcurrentArguments];
JSValue*jsValue = [argumentsobjectAtIndex:0];
NSString*jsonStr = [jsValuetoString];
NSDictionary*paramDict = [selfdictionaryWithJsonString:jsonStr];
NSString *src = [NSString stringWithFormat:@"%@", [paramDict[@"src"] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]];
NSURL*downloadUrl = [NSURLURLWithString:src];
dispatch_async(dispatch_get_main_queue(), ^{
if([[UIApplicationsharedApplication]canOpenURL:downloadUrl]){
[[UIApplicationsharedApplication]openURL:downloadUrl];
}
});
};
// 将json字符串转成字典对象
- (NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString{ if (jsonString == nil) { return nil; } NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; NSError *err; NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err]; if(err) { NSLog(@"json解析失败:%@",err); return nil; } return dic;}
对于UIWebview 中进行的方法,在H5页面进行调用方法:
getMessage(msgStr); // msgStr 为回传给webview 的参数json字符串
2. 关于WKWebView 和嵌入的H5页面的交互(点击H5页面上的按钮,执行iOS原生方法)
在WKViewView 初始化的时候进行JS 方法注入
- (WKWebView *)webView
{
if(!_webView)
{
WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
//实例化对象
configuration.userContentController= [WKUserContentControllernew];
//调用JS方法
[configuration.userContentController addScriptMessageHandler:self name:@"backClick"];
_webView= [[WKWebViewalloc]initWithFrame:CGRectMake(0,0,MAIN_WIDTH,MAIN_HEIGHT)configuration:configuration];
_webView.navigationDelegate = self;
[self.viewaddSubview:_webView];
}
return _webView;
}
// 添加scriptMessageHandler
- (void)addScriptMessageHandler:(id)scriptMessageHandlername:(NSString*)name{
}
#pragma mark - WKScriptMessageHandler
- (void)userContentController:(WKUserContentController*)userContentControllerdidReceiveScriptMessage:(WKScriptMessage*)message {
NSLog(@"输出message:%@---%@",message.name,message.body);
if([message.nameisEqualToString:@"backClick"]) {
[self.navigationController popViewControllerAnimated:YES];
}
}
在H5页面通过方法调用注入的方法’backClick‘
window.webkit.messageHandlers.backClick.postMessage("测试")
注意:此处的postMessage 方法为要传入的参数字符串, 如果不需要传参数,也需要传一个空串,否则,原生的代理方法中监听不到该方法