Android-JS交互 非JSON(JS对象、匿名回调)如何解

2019-08-07  本文已影响0人  JeahWan

最近公司项目与三方h5页面对接,要求实现几个js方法,但是看了所谓的文档是这样的....

image.png
(这里马赛克的内容就是我们平时和h5约定好的注入js对象名,下文以mlb代替)


wtf????js对象?匿名函数?大哥我是用java的,可怜可怜吧 接受不了js对象啊 更别提匿名函数了,只能接受string


于是找对方沟通,对方表示为了保持良好的兼容性(LZ就不想改)
只能这个样子,你自己想办法吧~

(微笑)


我只是想要把参数json序列化,另外要个回调函数名,很简单啊 5分钟 哦不 3分钟就能搞定对吧?

可是对面死活不给改啊,这你说我该怎么办。。。


小脑袋开始思索....

我想要给他的参数穿身名为json的衣服;
我想要给可怜的匿名函数起个名纸;

想法是有了,但怎么实现呢?java实现?不存在的。js方法重载?好主意!!


大家都知道咱强大的webview是可以通过

loadUrl("javascript:"+"函数名啊什么的") 

来加载js代码的,那么ok,我来帮对面完成交互应有的样子(没错,我 对接 我自己!)

摆在眼前的一座大山,我不会js代码啊 肿么办?


这么办:

image.png

接通了 接通了...


image.png




image.png



好吧 ,其实哥们儿就在旁边,肯德基在对面~
简单的讲解了下需求,作为前端巨佬的哥们,3分钟甩我脸上一段js:

//这行代码也是个坑 开始注入失败 说window.mlb未定义 需要加上这行先声明
window.mlb= {};

window.keys = {
    callback: 'APPCallback'
};

window.mlb.getLocation = function (data, cb) {
    //在原本的data中加入一个新的字段callback 也就是回调函数名
    data.callback=keys.callback;
    //将远方的cb赋值给自己声明的
    window[keys.callback] = cb;
    //control是我们自己跟自己人约定的标识
    window.control.getLocation(JSON.stringify(data));
};



OK,万事俱备,只欠注入

在webview的onPageFinished中:

@Override
public void onPageFinished(WebView view, String url) {
        //getJs是我自己写的一个方法 因为代码较多 放到了一个js文件中 
        //从assets中读取字符串出来 不要忘记前缀javascript:
        webview.loadUrl("javascript:" + getJs());
        super.onPageFinished(view, url);
}




十分舒适。

上一篇 下一篇

猜你喜欢

热点阅读