问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

html5怎么与android交互

发布网友 发布时间:2022-04-22 07:05

我来回答

2个回答

懂视网 时间:2022-04-20 03:08

本篇文章给大家带来的内容是关于HTML5和原生app如何进行交互?有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

h5与原生 app 交互的原理

现在移动端 web 应用,很多时候都需要与原生 app 进行交互、沟通(运行在 webview 中),比如微信的 jssdk,通过 window.wx 对象调用一些原生 app 的功能。所以,这次就来捋一捋 h5 与原生 app 交互的原理。

h5 与原生 app 的交互,本质上说,就是两种调用:

  1. app 调用 h5 的代码

  2. h5 调用 app 的代码

1. app 调用 h5 的代码

因为 app 是宿主,可以直接访问 h5,所以这种调用比较简单,就是在 h5 中曝露一些全局对象(包括方法),然后在原生 app 中调用这些对象。

251094793-5bcd47918084f_articlex.png

javascript

window.sdk = {
 double = value => value * 2,
 triple = value => value * 3,
};

android

webview.evaluateJavascript('window.sdk.double(10)', new ValueCallback<String>() {
 @Override
 public void onReceiveValue(String s) {
 // 20
 }
});

ios

NSString *func = @"window.sdk.double(10)";
NSString *str = [webview stringByEvaluatingJavaScriptFromString:func]; // 20

2. h5 调用 app 的代码

因为 h5 不能直接访问宿主 app,所以这种调用就相对复杂一点。

这种调用常用有两种方式:

  1. 由app向h5注入一个全局js对象,然后在h5直接访问这个对象

  2. 由h5发起一个自定义协议请求,app拦截这个请求后,再由app调用 h5 中的回调函数

2.1 由 app 向 h5 注入一个全局 js 对象

这种方式沟通机制简单,比较好理解,并且对于 h5 来说,没有新的东西,所以是比较推荐的一种方式。但这种方式可能存在安全隐患,详细查看 你不知道的 Android WebView 使用漏洞。

668561095-5bcd479f406f3_articlex.png

android

webview.addJavascriptInterface(new Object() {
 @JavascriptInterface
 public int double(value) {
 return value * 2;
 }
 
 @JavascriptInterface
 public int triple(value) {
 return value * 3;
 }
}, "appSdk");

ios

NSString *scripts = @"window.appSdk = {double: value => value * 2, triple: value => value * 3}";
[webview stringByEvaluatingJavaScriptFromString:scripts];

javascript

window.appSdk.double(10); // 20

2.2 由 h5 发起一个自定义协议请求

这种方式要稍复杂一点,因为需要自定义协议,这对很多前端开发者来说是比较新的东西。所以一般不推荐这种方式,可以作为第一种方式的补充。

大致需要以下几个步骤:

  1. 由 app自定义协议,比如 sdk://action?params

  2. 在 h5 定义好回调函数,比如 window.bridge = {getDouble: value => {}, getTriple: value => {}}

  3. 由 h5 发起一个自定义协议请求,比如 location.href = 'sdk://double?value=10'

  4. app 拦截这个请求后,进行相应的操作,获取返回值

  5. 由 app 调用 h5 中的回调函数,比如 window.bridge.getDouble(20);

568479427-5bcd47ade3aa8_articlex.png

javascript

window.bridge = {
 getDouble: value => {
 // 20
 }, 
 getTriple: value => {
 // more 
 }
};

location.href = 'sdk://double?value=10';

android

webview.setWebViewClient(new WebViewClient() {
 @Override
 public boolean shouldOverrideUrlLoading(WebView view, String url) {
 // 判断如果 url 是 sdk:// 打头的就拦截掉
 // 然后从 url sdk://action?params 中取出 action 与params 
 
 Uri uri = Uri.parse(url);     
 if ( uri.getScheme().equals("sdk")) {

  // 比如 action = double, params = value=10
  webview.evaluateJavascript('window.bridge.getDouble(20)');

  return true;
 }
 return super.shouldOverrideUrlLoading(view, url);
 }
});

ios

- (BOOL)webview:(UIWebView *)webview shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
 // 判断如果 url 是 sdk:// 打头的就拦截掉
 // 然后从 url sdk://action?params 中取出 action 与params

 NSString *urlStr = request.URL.absoluteString;
 
 if ([urlStr hasPrefix:@"sdk://"]) {
 
 // 比如 action = double, params = value=10
 NSString *func = @"window.bridge.getDouble(20)";
 [webview stringByEvaluatingJavaScriptFromString:func];

 return NO;
 }

 return YES;
}

热心网友 时间:2022-04-20 00:16

Android中构建HTML5应用
使用WebView控件,与其他控件的使用方法相同在layout中使用一个标签,WebView不包括导航栏,地址栏等完整浏览器功能,只用于显示一个html.
在WebView中加载Web页面:
(1)注意在manifest文件中加入访问互联网的权限:
<</SPAN>uses-permission android:name="android.permission.INTERNET" />
在Android中点击一个链接,默认是调用应用程序来启动,因此WebView需要代为处理这个动作通过WebViewClient。
(2)在布局文件中(main.xml),添加标签WebView的id
[html] view plaincopyprint?
<</SPAN>WebView
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
(2)在onCreate()中使用loadUrl(...)加载html。
[java] view plaincopyprint?
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

WebView mWebView = (WebView)findViewById(R.id.webview);
// mWebView.getSettings().setJavaScriptEnabled(true);
// mWebView.setWebChromeClient(new WebChromeClient());
mWebView.loadUrl("file:///android_asset/www/NewFile.html");
}
(3)实现android与js交互
默认情况下WebView中的js是禁用的,通过将WebSettings附加到WebView中启动js,可以用getSettings()检索WebSettings,然后用setJavaScriptEnabled()启动js。
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebChromeClient(new WebChromeClient());
(4)在JS中调用Android的函数方法
把本类的一个实例添加到js的全局对象window中,这里是"injs"。
mWebView.addJavascriptInterface(new JavaScriptInterface(),"injs");
实现JavaScriptInterface()类,这里在该类中定义一个方法public void runOnAndroidJavaScript(final String str){...}
在js中调用java函数
windows.injs.runOnAndroidJavaScript(str);//调用android的函数
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
梦见水猴,俗称水鬼。是好是坏 驱虫药多久吃一次 什么情况需要吃打虫药 我的微信公众号太久没有更新被冻结了,怎么样才能注销重新 三星note3画笔画的作品(扩展名SPD)怎么样下载到电脑?怎样转换成JPG格式... 火灾甲乙丙丁类怎么分 什么叫甲类、乙类、丙类和丁类液体 小分子化合物库选哪家放心? 怪物猎人世界肉块交货方法介绍介绍_怪物猎人世界肉块交货方法介绍是什么... 怪物猎人世界肉块获得方法介绍介绍_怪物猎人世界肉块获得方法介绍是什么... 开心消消消赚钱版福利 暴走英雄坛奇货店在哪 android html5 框架哪个好 暴走英雄坛顾氏印书馆在哪里 飞利浦s5675剃须刀和s6500哪个好 android支持html5 video标签,实现在线播放吗 如何卖个好手机,怎么挑选? 暴走英雄坛谁掉和田玉佩 如何做好手机销售? android和html5哪个前景好 暴走英雄坛怎么得装备 飞利浦剃须刀那个型号最好用`? 外存读写速度由快到慢,依次排列 怎样 用html5开发android app 如何提高销售技巧?(卖手机的) 下列存储中,读写速度由快到慢的是() ARAM B硬盘... 飞利浦剃须刀最贵是哪款啊?嘿嘿 我是卖手机的,怎么才能做好手机销售?怎么才能提... 暴走英雄坛善恶值等级划分是什么? 为什么我的移动硬盘存取速度时快时慢? 安卓支持html5么 飞利浦剃须刀型号中的RQ、PQ、HQ分别代表什么意思 暴走英雄坛6瓶美肤露在哪里 android 点击通知栏消息进入html5界面怎么实现 想买个中高档飞利浦剃须刀 暴走英雄坛游戏机在哪 有哪些基于IPFS的网站或者应用值得推荐? 安卓系统能运行HTML5格式的程序吗? HTML5会不会威胁Android的开发? 暴走英雄坛金戒指在哪里 上传到ipfs上的两个文件,为什么一个可以通过网址+... 暴走英雄坛冰火岛团藏在哪 关于android安卓底层与应用层HTML5的问题,求大家... android中怎么使用html5离线功能 ipfs怎么部署?网站可以放入ipfs吗? android html5怎么关闭 QQ三国快速跑行脚秘籍 html5开发android利弊 什么是IPFS? html5能取代android和ios应用程序吗 QQ三国跑行脚问题