HTML5和原生app如何进行交互?

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

h5与原生 app 交互的原理

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

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

app 调用 h5 的代码

立即学习“前端免费学习笔记(深入)”;

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() {  @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,所以这种调用就相对复杂一点。

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

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

由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 发起一个自定义协议请求

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

大致需要以下几个步骤:

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

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

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

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

由 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;}

登录后复制

以上就是HTML5和原生app如何进行交互?的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2908699.html

(0)
上一篇 2025年3月11日 03:12:56
下一篇 2025年3月6日 12:04:13

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • HTML5中一些可以优化的细节介绍

    本篇文章给大家带来的内容是关于html5中一些可以优化的细节介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 介绍一些最近整理的优化细节。图片压缩什么的就不说了,这是优化必须做的。今天就说一下大家写代码时可以培养的优化的…

    编程技术 2025年3月11日
    200
  • 用canvas实现简单的下雪效果(附代码)

    本篇文章给大家带来的内容是关于用canvas实现简单的下雪效果(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 首先新建一个html文件,将body的背景设置为天空的那种深蓝色,并创建一个canvas,canvas…

    2025年3月11日
    200
  • svg和css3实现环形渐变进度条的代码示例

    本篇文章给大家带来的内容是关于svg和css3实现环形渐变进度条的代码示例,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 在负责的项目中,有一个环形渐变读取进度的效果的需求,于是在网上查阅相关资料整理一下。 代码如下: T…

    编程技术 2025年3月11日
    200
  • 什么是前端和后端

    什么是前端和后端?前端和后端哪个好?相信很多小白都会有这样的的问题,下面我们就来讲解一下前端和后端的区别是什么? 什么是前端和后端? 网站前端是对网页静态页面的设计,通俗的来说,就是我们肉眼能看的到的东西,当我们浏览网站的时候所看到的页面上…

    2025年3月11日
    200
  • app是什么意思

    说起app很多人应该不陌生,大家手机里都是有很多app软件,那么app是什么意思?小编就给大家科普一下app是什么? 本教程操作环境:Funtouch OS 13系统,vivo NEX手机。 一:app是什么意思 app是安装在智能手机中应…

    2025年3月11日
    200
  • canvas中普通动效与粒子动效的实现 方法介绍(代码示例)

    本篇文章给大家带来的内容是关于canvas中普通动效与粒子动效的实现 方法介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 canvas用于在网页上绘制图像、动画,可以将其理解为画布,在这个画布上构建想要的效…

    2025年3月11日 编程技术
    200
  • H5使用react组件实现拍照、选择图片上传

    本篇文章给大家带来的内容是关于h5使用react组件实现拍照、选择图片上传,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 前段时间项目重构,改成SSR的项目,但之前用的图片选择上传组件不支持SSR(server-side-…

    编程技术 2025年3月11日
    200
  • 实现marquee滚动(代码示例)

    本篇文章给大家带来的内容是关于实现marquee滚动(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 背景:marquee标签在有些浏览器兼容性不好,就手动用原生js实现了下。 横着滚动效果链接描述 传奇无双12…

    编程技术 2025年3月11日
    200
  • HTML5中五种存储方式的介绍

    本篇文章给大家带来的内容是关于html5中五种存储方式的介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 h5之前,存储主要是用cookies。cookies缺点有在请求头上带着数据,大小是4k之内。主Domain污染。…

    2025年3月11日
    200
  • exports和module.expors之间有什么区别及联系?

    本篇文章给大家带来的内容是关于exports和module.expors之间有什么区别及联系?有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 我们在模块化开发中,必须会用到exports/module.exports这两个玩…

    2025年3月11日 编程技术
    200

发表回复

登录后才能评论