前言:
迩来开发vue与app交互,总结了一下开发心得。我是一名Android开发者,vue开发这块也稍有涉足,在android或者IOS中展示h5可以减少工作量,也能满足用户体验性。下面主要以Android和Vue方法介绍为主。
上菜了
一、h5与App交互的两种情势
1.h5调用app的原生方法。
2.app嗲用h5方法
二、Android基本设置
- WebSettings webSettings=webView.getSettings();
- //设置为可调用js方法
- webSettings.setJavaScriptEnabled(true);
- webView.setWebViewClient(new WebViewClient());
- webView.setWebChromeClient(new WebChromeClient());
- //js调用android
- webView.addJavascriptInterface(new JsCommunication(), "handleMessage");
- //你自己的h5地址
- webView.loadUrl("http://192.168.23.6:8080/#/webview");
复制代码 三、 vue代码
- <template>
- <div class="box">
- <button @click="jsAndroid">JS调用Android方法</button>
- <button @click="jsIos">JS调用IOS方法</button>
- <button @click="jsAI">JS调用Android||IOS方法</button>
- <div>
- <span>Android||IOS调用h5方法,控制内用显示</span>
- <div v-if="isShow">
- <img src="https://imgsa.baidu.com/forum/w%3D580/sign=1b2a89cb16950a7b75354ecc3ad0625c/2635349b033b5bb59ec8f2033dd3d539b600bc35.jpg" alt="">
- </div>
- </div>
- <div>
- <span>Android||IOS调用h5方法,并传值</span>
- <img :src="imgUrl" alt="">
- </div>
- </div>
- </template>
- <script>
- import { toRefs, reactive, onMounted } from "vue";
- export default {
- // vue3.0 钩子函数写法
- setup() {
- const obj = reactive({
- isShow: false,
- content: "接受内容",
- imgUrl:'https://pic4.zhimg.com/v2-112e0474e000e98e8fbd22ced185c923_b.gif',
- // 这里Android和ios判断固定了,判断方法这里就不写了,网上很多资料
- isIOS:false,
- isAndroid:true
- })
- onMounted(()=>{
- window.sendImageURL=sendImageURL
- window.show=()=>{
- obj.isShow=!obj.isShow
- }
- })
- const jsAndroid=()=>{
- window.handleMessage.toast('你好,调用成功?')
- }
- const jsIos=()=>{
- window.webkit.messageHandlers.handleMessage.toast('你好,调用成功?');
- }
- const jsAI=()=>{
- //app端会拿到对应的方法,然后app端做处理
- if (obj.isIOS) {
- window.webkit.messageHandlers.handleMessage.toast('1212121');
- } else if (obj.isAndroid) {
- window.handleMessage.toast('你好,调用成功?')
- }
- }
- const sendImageURL=(imgUrl)=>{
- obj.imgUrl=imgUrl
- }
- return {
- ...toRefs(obj),
- jsAndroid,
- jsIos,
- jsAI,
- sendImageURL
- };
- },
- };
- </script>
- <style lang="scss" scoped>
- * {
- margin: 0px;
- padding: 0px;
- }
- .box {
- display: flex;
- flex-direction: column;
- button {
- margin: 10px;
- padding: 18px;
- background: gold;
- color: #fff;
- font-weight: 700;
- border: none;
- }
- img {
- width: 188px;
- height: 127px;
- }
- }
- </style>
复制代码 四、App调用h5方法
注意,Vue中的方法通常是写在vue实例的methods中的,app无法直接调用,此时在页面的onMounted钩子里将方法挂在window下即可。
Vue代码
- onMounted(()=>{
- //挂载方法到window上面
- window.sendImageURL=sendImageURL
- //可以直接定义成匿名函数
- window.show=()=>{
- obj.isShow=!obj.isShow
- }
- })
- const sendImageURL=(imgUrl)=>{
- obj.imgUrl=imgUrl
- }
复制代码 Android可以通过: webView.loadUrl("javascript:sendImageURL('" + img + "')");
sendImageURL:方法名
img:需要传递的参数
- btn.setOnClickListener(v->{
- //android调用js,无参数无返回值
- webView.loadUrl("javascript:show()");
- });
- btn2.setOnClickListener(v->{
- //android调用js,无参数无返回值
- webView.loadUrl("javascript:sendImageURL('" + img + "')");
- });
复制代码 IOS类似Android
- NSString *img = @"图片地址";
- NSString *jsStr = [NSString stringWithFormat:@"sendImageURL('%@')",img];
-
- [self->_wkWebView evaluateJavaScript:jsStr completionHandler:^(id _Nullable d, NSError * _Nullable error) {
-
- NSLog(@"状态---%@",d);//回调值
-
- }];
复制代码 五、h5调用app方法
vue方法,注意一定要挂载到window上,否则回报未定义,点掉叉号后虽然调用的时间能成功。
handleMessage:app上面定义的接口名称
toast:app上定义的方法名称
- const jsAndroid=()=>{
- window.handleMessage.toast('你好,调用成功?')
- }
- const jsIos=()=>{
- window.webkit.messageHandlers.toast.postMessage('你好,调用成功?');
- }
- const jsAI=()=>{
- //app端会拿到对应的方法,然后app端做处理
- if (obj.isIOS) {
- window.webkit.messageHandlers.toast.postMessage('1212121');
- } else if (obj.isAndroid) {
- window.handleMessage.toast('你好,调用成功?')
- }
- }
复制代码 Android代码
- //js调用android
- webView.addJavascriptInterface(new JsCommunication(), "handleMessage");
- public class JsCommunication {
- @JavascriptInterface
- public void toast(String json) {
- Toast.makeText(MainActivity.this,json,Toast.LENGTH_LONG).show();
- }
- }
复制代码 以上就是遇到的题目和总结,希望对你有资助。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |