关于IOS的UIWebView 和WKWebView与嵌入H5页面交互

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 方法为要传入的参数字符串, 如果不需要传参数,也需要传一个空串,否则,原生的代理方法中监听不到该方法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容