Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >H5 App实战进阶十五:H5 App与原生应用的交互

H5 App实战进阶十五:H5 App与原生应用的交互

原创
作者头像
china马斯克
发布于 2024-12-05 00:03:42
发布于 2024-12-05 00:03:42
2340
举报

推荐

文章开始之前,推荐一下别人写的佳作,大家感兴趣的也可以去读一下。

推荐文章:Nacos架构分析与用法-腾讯云开发者社区-腾讯云

这篇文章系统地介绍了Nacos作为Dynamic Naming and Configuration Service,是构建云原生应用的重要工具,提供了动态服务发现、配置管理和服务管理功能。其总体架构包含命名服务、配置服务和元数据服务,三大组件协同工作,支持微服务架构。Nacos支持单机、集群和多集群模式,满足不同场景需求。服务注册与发现、配置管理和元数据管理是Nacos的核心功能,实现了服务的动态管理和配置的灵活更新。整体来看,Nacos功能全面,易于使用,是微服务架构中不可或缺的一部分

。总的来说是一篇不可多得的实用指南。

下面正文开始:

正文

在H5 App开发中,与原生应用的交互是一个重要的环节。通过合理的交互设计,可以实现H5页面与原生应用之间的数据传递和功能调用,从而提升用户体验和应用性能。本文将扩展和完善第4篇的内容,详细讲解H5 App与原生应用交互的方法,并附带示例代码。

一、交互方式概述

H5 App与原生应用的交互主要通过以下几种方式实现:

  1. URL Scheme:通过特定的URL协议,H5页面可以触发原生应用的功能或跳转到原生页面。
  2. JavaScript Interface(JSBridge):原生应用通过注入JavaScript接口到WebView中,让H5页面可以调用原生方法。
  3. WebView的message事件:H5页面通过postMessage方法发送消息,原生应用通过监听message事件接收消息。
  4. Hybrid框架:使用专门的Hybrid框架(如Uni-app、Cordova等)提供的API进行交互。
二、URL Scheme交互示例

URL Scheme是一种简单直接的交互方式,适用于H5页面触发原生应用功能或页面跳转的场景。

示例

假设我们有一个原生应用,它定义了一个名为myapp的URL Scheme。H5页面可以通过以下方式触发原生应用的功能:

代码语言:txt
AI代码解释
复制
<!-- H5页面代码 -->
<button onclick="openNativeApp()">Open Native App</button>
 
<script>
function openNativeApp() {
    // 假设原生应用定义了myapp://openFeature作为触发特定功能的URL
    window.location.href = 'myapp://openFeature';
}
</script>

在原生应用中,需要监听这个URL Scheme并做相应的处理:

Android示例

代码语言:txt
AI代码解释
复制
// 在Activity中重写shouldOverrideUrlLoading方法
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (url.startsWith("myapp://")) {
        // 处理URL Scheme
        if (url.equals("myapp://openFeature")) {
            // 打开特定功能
            openFeature();
            return true; // 表示已经处理该URL,不需要继续加载
        }
    }
    return super.shouldOverrideUrlLoading(view, url);
}

iOS示例

代码语言:txt
AI代码解释
复制
// 在UIWebView的代理方法中处理URL Scheme
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSURL *url = request.URL;
    if ([url.scheme isEqualToString:@"myapp"]) {
        if ([url.host isEqualToString:@"openFeature"]) {
            // 打开特定功能
            [self openFeature];
            return NO; // 表示已经处理该URL,不需要继续加载
        }
    }
    return YES; // 表示继续加载其他URL
}
三、JavaScript Interface(JSBridge)交互示例

JavaScript Interface允许原生应用向H5页面注入JavaScript对象,H5页面可以通过这些对象调用原生方法。

示例

在原生应用中,向WebView注入一个名为NativeBridge的JavaScript对象:

Android示例

代码语言:txt
AI代码解释
复制
webView.addJavascriptInterface(new NativeBridge(this), "NativeBridge");
 
// NativeBridge类定义
public class NativeBridge {
    Context mContext;
 
    NativeBridge(Context context) {
        mContext = context;
    }
 
    @JavascriptInterface
    public void showToast(String message) {
        Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show();
    }
}

iOS示例

代码语言:txt
AI代码解释
复制
// 在WebView加载完成后注入JavaScript对象
[webView stringByEvaluatingJavaScriptFromString:@"window.NativeBridge = { showToast: function(message) { window.location = 'nativebridge://showToast?message=' + encodeURIComponent(message); } }"];
 
// 监听URL Scheme并处理
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSURL *url = request.URL;
    if ([url.scheme isEqualToString:@"nativebridge"]) {
        if ([url.host isEqualToString:@"showToast"]) {
            NSString *message = [url.query componentsSeparatedByString:@"="][1];
            message = [message stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
            // 显示Toast
            [self showToast:message];
            return NO; // 表示已经处理该URL,不需要继续加载
        }
    }
    return YES; // 表示继续加载其他URL
}
 
// 显示Toast的方法
- (void)showToast:(NSString *)message {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Toast" message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];
}

在H5页面中,可以通过NativeBridge对象调用原生方法:

代码语言:txt
AI代码解释
复制
<!-- H5页面代码 -->
<button onclick="showNativeToast()">Show Native Toast</button>
 
<script>
function showNativeToast() {
    // 调用原生方法显示Toast
    window.NativeBridge.showToast('Hello from H5!');
}
</script>

注意:在iOS中,由于安全原因,注入的JavaScript对象的方法名必须以大写字母开头,并且需要在@JavascriptInterface注解中声明。同时,由于UIWebView已被废弃,建议使用WKWebView并通过WKScriptMessageHandler来处理JavaScript调用。

四、WebView的message事件交互示例

使用WebView的message事件可以实现H5页面与原生应用之间的双向通信。

示例

在原生应用中,监听WebView的message事件:

Android示例

代码语言:txt
AI代码解释
复制
webView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        // 处理其他URL Scheme
        return super.shouldOverrideUrlLoading(view, request);
    }
 
    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        // 监听message事件
        view.evaluateJavascript("(function() { " +
                "var eventMethod = window.addEventListener ? 'addEventListener' : 'attachEvent';" +
                "var eventer = window[eventMethod];" +
                "var messageEvent = eventMethod == 'attachEvent' ? 'onmessage' : 'message';" +
                "eventer(messageEvent, function(e) {" +
                "android.WebViewJavascriptBridge.handleJavascriptMessage(JSON.stringify(e.data));" +
                "}, false);" +
                "})()", null);
    }
});
 
// 处理JavaScript消息的方法
public void handleJavascriptMessage(String message) {
    // 解析并处理消息
    // ...
}

在H5页面中,通过postMessage方法发送消息给原生应用:

代码语言:txt
AI代码解释
复制
<!-- H5页面代码 -->
<button onclick="sendMessageToNative()">Send Message to Native</button>
 
<script>
function sendMessageToNative() {
    // 发送消息给原生应用
    if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.handleMessage) {
        window.webkit.messageHandlers.handleMessage.postMessage('Hello from H5!');
    } else if (window.android && window.android.WebViewJavascriptBridge) {
        // Android特定处理(如果使用WebViewJavascriptBridge库)
        window.android.WebViewJavascriptBridge.send(
            JSON.stringify({ handler: 'handleMessage', data: 'Hello from H5!' })
        );
    } else {
        console.error('No message handler available');
    }
}
</script>

注意:在iOS中,webkit.messageHandlers是WKWebView提供的API,用于处理JavaScript与原生应用之间的消息传递。而在Android。

URL参数适用于简单的数据传递,如页面跳转时传递参数;HTTP请求适用于需要向服务器请求数据或提交数据的场景;而WebSocket则适用于需要实时通信的场景,如聊天应用、实时游戏等。H5 App与原生应用的交互是移动应用开发中的重要一环。通过选择合适的数据传递方式、优化方法调用、统一接口规范以及做好错误处理等措施,可以实现高效、稳定的交互功能,为用户提供更加丰富和便捷的应用体验。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
iOS与JS的交互
iOS和JS的交互看似两个问题,其实要解决的问题只有一个,那就是JS如何调用native方法。因为查询文档我们就可以发现,在UIWebView中,native有直接调用JS的方法, 但是JS却没有直接调用native的方法。 一、native直接调用js的方法: -(NSString*)stringByEvaluatingJavaScriptFromString :(NSString *)script; 二、JS直接调用native的方法 其实,UIWebView并没有提供JS调用native的方法,但是我
梧雨北辰
2018/04/24
4.2K0
前端工程师所需要了解的WebView
| 导语 现如今,在做移动端 H5 开发时,少不了与 Native 之间进行交互。而在Native中,H5的承载容器为 WebView,其核心是使用 WebView 控件实现加载 url。
秋风的笔记
2021/03/29
2.3K0
前端工程师所需要了解的WebView
APP内嵌H5页面中JS和APP的交互解决方案(可传参、可回调)
本库主要使用 WebViewJavascriptBridge 和 webkit MessageHandler进行封装。
Careteen
2022/02/14
7K0
WebViewJavaScriptBridge深入剖析
前一篇文章中,我们大致的讲述了一下JavaScriptCore这个库在iOS开发中的应用。在文中最后的阶段,我们提到了WebViewJavaScriptBridge这个库。提到这个库,可能有一些人就要说了,现在都什么时代了,谁还会用这个库啊?全是坑!不错,早在三年前,这个库有过一段辉煌的时光,在苹果除了WKWebView之后,渐渐的使用这个库的人越来越少,尽管这个库也是支持了WKWebView的。 但是一个事物的存在就有他的价值,就算使用也不是那么频繁了,尽管他有很多的坑。但是对于一个开发者来说,我们应该取其精华去其糟粕,现如今出的很多的交互的bridge依旧是有部分交互逻辑沿用了WebViewJavaScriptBridge的思想。 这里就不得不提味精大神的一片文章,这篇文章里面深入浅出的谈了谈现如今Hybrid开发时常用的一些桥方法。有兴趣的可以去关注一下。废话不多说,那么我们今天就从源码开始解析这个库的使用以及原理。
iOSSir
2019/06/14
6820
H5与Android&iOS客户端原生APP通信交互实现
最近有个需求,原生 APP 使用 webView 内嵌 H5 页面,APP 未登录状态下打开 H5 页面,在页面中登录,再返回 APP 时要保持登录状态(APP 也要同步登录)。
德顺
2021/01/21
2.7K0
JSBridge深度剖析
概述 做过混合开发的人都知道Ionic和PhoneGap之类的框架,这些框架在web基础上包装一层Native,然后通过Bridge技术的js调用本地的库。 在讲JSBridge技术之前,我们来看一下传统的实现方式。 Android端 Native调JS native调用js比较简单,只要遵循:”javascript: 方法名(‘参数,需要转为字符串’)”的规则即可。 在4.4之前,调用的方式: // mWebView = new WebView(this); mWebView.lo
xiangzhihong
2018/02/06
3.8K0
JSBridge深度剖析
探究Hybrid-APP技术原理
随着Web技术的发展和移动互联网的发展,Hybrid技术已经成为一种前端开发的主流技术方案。那什么是Hybrid App呢?
Tiffany_c4df
2019/09/04
9280
浅谈Hybrid
随着 Web 技术和移动设备的飞速发展,各种 APP 层出不穷,极速的业务扩展提高了团队对开发效率的要求,这个时候使用 IOS/Andriod 开发一个 APP 似乎成本有点过高了,而 H5 的低成本、高效率、跨平台等特性马上被利用起来形成了一种新的开发模式:Hybrid APP。
前端森林
2020/04/23
7K0
浅谈Hybrid
h5 与原生 app 交互的原理
现在移动端 web 应用,很多时候都需要与原生 app 进行交互、沟通(运行在 webview 中),比如微信的 jssdk,通过 window.wx 对象调用一些原生 app 的功能。所以,这次就来捋一捋 h5 与原生 app 交互的原理。 h5 与原生 app 的交互,本质上说,就是两种调用:
编程怪才-凌雨画
2020/09/17
2.6K0
iOS下JS与原生OC互相调用(总结)
iOS开发免不了要与UIWebView打交道,然后就要涉及到JS与原生OC交互,今天总结一下JS与原生OC交互的两种方式。
Haley_Wong
2018/08/22
5K0
JS Bridge 通信原理
之前介绍了移动端开发的相关技术,这一篇主要是从 Hybrid 开发的 JS Bridge 通信讲起。
尹光耀
2022/03/22
4.9K0
JS Bridge 通信原理
用WebViewJavascriptBridge进行JS和app进行交互
做项目的时候有一个业务是需要前端web给安卓发送指令,进行拍照个读取身份证的操作,这个时候是需要用户进入页面的时候直接进行的操作,那么这个时候我需要做的是告诉安卓什么时候调取什么样子的硬件,那么我们难题就是js和安卓怎么进行通信,有这样的需求也是很少见的,但是既然存在这样的需求还是需要进行解决的,那么我参考的是这个地址的方案: JsBridge
何处锦绣不灰堆
2020/05/28
3.3K0
JsBridge实现JavaScript和Java的互相调用
前端网页JavaScript(下文简称Js)和Java互相调用在手机应用中越来越常见,JsBridge是最常用的解决方案。 1. Js调用Java,Java调用Js 在Android开发中,能实现Js调用Java,有4种方法: 1.JavascriptInterface 2.WebViewClient.shouldOverrideUrlLoading() 3.WebChromeClient.onConsoleMessage() 4.WebChromeClient.onJsPrompt() 1.1 Javas
QQ音乐技术团队
2018/01/30
2.5K0
JsBridge实现JavaScript和Java的互相调用
iOS WebView 的 Hybrid 框架设计
随着移动互联网的发展,APP 开发模式也在不断的创新,从最初的 Native 开发到后来的 Hybrid 混合开发,再到最近比较火爆的 React Native、Weex 等项目,这些都标志着 APP 开发已经不再是纯 Native 的工作,还要涉及很多跨平台的技术。
前端黑板报
2018/12/24
1.7K0
Android原生与H5通信
  如今,混合开发似乎成为了主流。H5拥有跨平台的优势,却存在性能上的问题正好可以用搭建原生壳承载H5代码的方式去解决。   如何理解这种方式,就好像说Android原生代码封装外壳,内部包含H5代码作为核心内容。更细节一点,我们把引导页、登录页、首页等等与业务关联打不并且与用户交互较多的页面用原生去写,而业务页面,逻辑代码由H5处理,将他们结合就形成了混合开发的由原生壳承载的H5APP。   这么做有什么好处呢?组个例子,我们利用这种方式做好了一个Android原生APP,现在需要做一个IOS原生APP,我们可以直接简单搭建一个IOS壳,复用H5代码,完成IOS原生APP。同时我们需要在钉钉、微信小程序等等平台搭建,可以直接复用我们已有的H5代码。   而这样的搭建方式比纯H5搭建的APP的优势在于因为有原生壳的存在,可以自由的使用原生API。保证了交互上的流畅性。
饮水思源为名
2018/09/06
1.1K0
H5如何与原生App通信?
为了提高开发效率,开发人员往往会使用原生app里面嵌套前端h5页面的快速开发方式,这就要涉及到h5和原生的相互调用,互相传递数据,接下来就实践项目中的交互方式做一个简单的记录分享,废话不多说,直接上正文:
用户9253515
2021/12/17
6.1K0
Hybrid App 应用开发中 5 个必备知识点复习
前言 我们大前端团队内部 📖每周一练 的知识复习计划还在继续,本周主题是 《Hybrid APP 混合应用专题》 ,这期内容比较多,篇幅也相对较长,每个知识点内容也比较多。 之前分享的每周内容,我都整理到掘金收藏集 📔《EFT每周一练》 上啦,欢迎点赞收藏咯💕💕。 注:本文整理资料来源网络,有些图片/段落找不到原文出处,如有侵权,联系删除。 一、什么是 Hybrid App,与 Native App 及 Web App 有什么区别 参考文章: 《Web App Hybrid App和 Native Ap
pingan8787
2019/09/05
2.3K0
Hybrid App 应用开发中 5 个必备知识点复习
Objective-c与js交互专题
在写 JavaScript 的时候,可以使用一个叫做 window 的对象,像是我们想要从现在的网页跳到另外一个网页的时候,就会去修改 window.kk 的位置;在我们的 Objective-C 程序码中,如果我们可以取得指定的 WebView 对象,也就可以拿到这个出现在 JavaScript 中的 window 对象,也就是 [webView windowScriptObject]。
江中散人_Jun
2022/03/08
1.8K0
JSB 原理与实践
我们开发的 h5 页面运行在端上的 WebView 容器之中,很多业务场景下 h5 需要依赖端上提供的信息/能力,这时我们需要一个可以连接原生运行环境和 JS 运行环境的桥梁 。 这个桥梁就是 JSB,JSB 让 Web 端和 Native 端得以实现双向通信。
用户6835371
2021/08/05
1.4K0
objC与js通信实现--WebViewJavascriptBridge
场景   在移动端开发中,最为流行的开发模式就是hybmid开发,在这种native和h5的杂糅下,既能在某些需求中保证足够的性能,也可以在某些列表详情的需求下采用h5的样式控制来丰富内容。但是在大型产品的开发中,往往前端的职责不仅仅是h5的编写,还包括基本业务逻辑的实现,比如在h5页面中确定当前用户所在的城市(location),我们可以采用html5规范的Geolocation接口,但是更为通俗的做法是调用native的本地接口,因此这种常规的场景就涉及到了js和native层通信的问题,这在手淘开发中
欲休
2018/03/15
1.5K0
相关推荐
iOS与JS的交互
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档