在webView 中使用JS 调用 Android / IOS的函数 Function

最近做一个项目,混合了NativeCode 和 HTML,为了便于JS 调用App的一些方法,统一封装一个Js方法,记录如下

Android 端首先要再WebView中允许JS的调用

WebView myWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
myWebView.addJavascriptInterface(new WebAppInterface(this), "JsAndroid");

IOS端使用的是一个开源库 EasyJsWebView,在IOS端引用即可

JS代码:

function callApp(method) {
        var args = [].slice.call(arguments).splice(1);
        var s = "";
        if (/android/i.test(navigator.userAgent)) {//安卓
            s = window["JsAndroid"][method].apply(window.JsAndroid, args);
        }
        if (/ipad|iphone|mac/i.test(navigator.userAgent)) {//ios
            s = window["JsIOS"][method].apply(this, args);
        }
        return s;
    }

//与IOS交互的方法
window.EasyJS = {
    __callbacks: {},

    invokeCallback: function (cbId, removeAfterExecute) {
        var args = Array.prototype.slice.call(arguments).splice(2);

        for (var i = 0, l = args.length; i < l; i++) {
            args[i] = decodeURIComponent(args[i]);
        }

        var cb = EasyJS.__callbacks[cbId];
        if (removeAfterExecute) {
            EasyJS.__callbacks[cbId] = undefined;
        }
        return cb.apply(null, args);
    },

    call: function (obj, functionName, args) {
        var formattedArgs = [];
        for (var i = 0, l = args.length; i < l; i++) {
            if (typeof args[i] == "function") {
                formattedArgs.push("f");
                var cbId = "__cb" + (+new Date);
                EasyJS.__callbacks[cbId] = args[i];
                formattedArgs.push(cbId);
            } else {
                formattedArgs.push("s");
                formattedArgs.push(encodeURIComponent(args[i]));
            }
        }

        var argStr = (formattedArgs.length > 0 ? ":" + encodeURIComponent(formattedArgs.join(":")) : "");

        var iframe = document.createElement("IFRAME");
        iframe.setAttribute("src", "easy-js:" + obj + ":" + encodeURIComponent(functionName) + argStr);
        document.documentElement.appendChild(iframe);
        iframe.parentNode.removeChild(iframe);
        iframe = null;

        var ret = EasyJS.retValue;
        EasyJS.retValue = undefined;

        if (ret) {
            return decodeURIComponent(ret);
        }
    },

    inject: function (obj, methods) {
        alert(obj);
        window[obj] = {};
        var jsObj = window[obj];
        for (var i = 0, l = methods.length; i < l; i++) {
            (function () {
                var method = methods[i];
                var jsMethod = method.replace(new RegExp(":", "g"), "");
                jsObj[jsMethod] = function () {
                    alert("qq");
                    return EasyJS.call(obj, method, Array.prototype.slice.call(arguments));
                };
            })();
        }
    }
};

  

说明一下,一开始调用Android也是采用window["JsAndroid"][method].apply(this,args),这样的话,就完全一致了。但是在调试的时候发现这种方式无法正常调用,google后发现是由于this的的影响域导致的,需要指明查找域。 参考

记录一下!

时间: 2024-10-11 10:21:34

在webView 中使用JS 调用 Android / IOS的函数 Function的相关文章

WebView中JS调用Android Method 遇到的坑整理

WebView是android中常用的一个组件,其作用是展示网页,并让网页和android app进行一些业务逻辑上的交互. 其坑无数,相信用过的都知道,一个一个来解决吧. 1.怎么互调: <!DOCTYPE> <html> <head> <meta charset="UTF-8"> <script type="text/javascript"> function android(bl){ if(bl){

webview中js调用Android中的方法

package com.example.helloworld; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.webkit.WebView; public class MainActivity extends Activity { private WebView webView = null

JS调用Android、Ios原生控件

在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时,提高代码质量,实现两者在网页端代码的统一. 首先我们先看一下Ios调用JS的方法实现: //无参调用 function SwiftCallJs1(){} //有参调用 function SwiftCallJs2(name, message){} 紧接着我们看一下Android调用JS的方法实现: /

PhoneGap或者Cordova框架下实现Html5中JS调用Android原生代码

PhoneGap或者Cordova框架下实现Html5中JS调用Android原生代码 看看新闻网>看引擎>开源产品 0人收藏此文章, 发表于8小时前(2013-09-06 00:39) , 已有13次阅读 ,共0个评论 依照我一惯得套路,我会先说一点废话. PhoneGap和Cordova什么关系?为什么有的地方叫Cordova而有的地方叫PhoneGap ?PhoneGap是一款HTML5平台.通过它,开发商能够使用HTML.CSS及JavaScript来开发本地移动应用程序.因此,眼下开

android 的webview调用php服务器js , js 调用Android的webview

最近项目的需求: Android通过webView调用php的数据 , 这时候是需要整理webview和JavaScript之间相互调用的时候了 一. 理清思路: (1) . 双方都是客户端 , 一个是Android , 一个是js( js当然是客户端 , 后面说明) (2) . Android的webview需要支持JavaScript , 即 WebSettings settings = myWebView.getSettings(); settings.setJavaScriptEnabl

WebView之js调用Android类的方法传递数据

1,具体的思路如下: 在android中写一个Activity,里面写一个webview,这个webview加载本地的一个html文件,显示这个网页,这个网页包括一个用户名和密码的输入框和两个按钮(只有登陆按钮有用),输入用户名密码之后调用android中的类,并把输入的数据传过去,再在android中输出出来(具体你那数据做什么操作就看你的需求了),这样就做大额js与android数据交互的效果了: 在android端,一些webviwe的设置和自定义类的写法如下源码: package com

[翻译]Nativescript 中 Web 视图与 Android/IOS 的双向通信

English document From http://shripalsoni.com/blog/nativescript-webview-native-bi-directional-communication/ Nativescript 中 Web 视图与 Android/IOS 的双向通信 由shripal编写 在Nativescript中 Nativescript 提供跨平台的 web 视图 ui 元素.它为在我们的页面中显示 web 视图内容提供了服务.但是, 如果您希望将一些数据发送

html中的js调用c#的winform程序

简单来说,就是在c#客户端winform中加载一个webBrowser1,然后通过webBrowser1中对页面的点击js效果触发c#的函数响应.亲测通过. C#代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using S

[IOS_HTML5]各种JS框架介绍--用HTML5/CSS3/JS开发Android/IOS应用

现在人人都想成为安卓/IOS应用开发工程师.其实,安卓/IOS应用可以用很多种语言来实现.由于我们前端开发工程师,对HTML5/CSS/JavaScript的网络编程已经相当熟悉了.所以,今天大家将会认识到一些利用前端语言来开发安卓/IOS应用的工具. 在文章的末尾,也介绍了使用JAVA.C#.Lua以及AS3来开发安卓应用的工具. 希望大家都能找到适合自己的开发工具!祝大家开发安卓/IOS应用一切顺利! PhoneGap 开发语言: HTML, CSS, JavaScript 开发工具: Ph