• JS调用原生
1
2
3
4
5
6
7
8
window.webkit.messageHandlers.<name>.postMessage(<messageBody>)
//其中<name>,就是上面方法里的第二个参数`name`。
//例如我们调用API的时候第二个参数填@"Share",那么在JS里就是:
//window.webkit.messageHandlers.Share.postMessage(<messageBody>)
//<messageBody>是一个键值对,键是body,值可以有多种类型的参数。
// 在`WKScriptMessageHandler`协议中,我们可以看到mssage是`WKScriptMessage`类型,有一个属性叫body。
// 而注释里写明了body 的类型:
Allowed types are NSNumber, NSString, NSDate, NSArray, NSDictionary, and NSNull.

!!!注意:不可以不传参,否则不会调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 传null
function scanClick() {
window.webkit.messageHandlers.ScanAction.postMessage(null);
}
// 传字典
function shareClick() {
window.webkit.messageHandlers.Share.postMessage({title:'测试分享的标题',content:'测试分享的内容',url:'http://www.baidu.com'});
}
// 传字符串
function playSound() {
window.webkit.messageHandlers.PlaySound.postMessage('shake_sound_male.wav');
}
// 传数组
function colorClick() {
window.webkit.messageHandlers.Color.postMessage([67,205,128,0.5]);
}

参考

  • 原生调用JS

JS

1
2
3
4
5
6
7
8
9
10
11
<html>
<body>
<div id="demo"></div>
<script>
function test(name){
console.log(name);
document.getElementById("demo").innerHTML = name;
}
</script>
</body>
</html>

​ Objective-C

1
2
3
NSString *jsStr = [NSString stringWithFormat:@"test('%@')",@"what the hell"];[self.webView evaluateJavaScript:jsStr completionHandler:^(id _Nullable result, NSError * _Nullable error) {
NSLog(@"%@--%@",result,error);
}];
  • 原生调用VUE

    VUE

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    export default{
    ...
    created(){
    window.nativeCallJS = this.nativeCallJS
    },
    methods:{
    nativeCallJS:function(data){
    return "return data" + data
    }
    }
    ...
    }

    Objective-C

    1
    window.webkit.messageHandlers.jsCallNative.postMessage(params)

    参考1 参考2

  • OC向JS传值

    如果是单个值,可以如下:

    如果是多个值,可以传json string。

    参考