热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WebView与APP交互实战纪录

WebView与APP交互WebView与APP交互,即网页经由历程JSBrige挪用APP的功用,APP也能够经由历程JSBrige挪用网页供应的要领。近来恰好打仗到这一块,纪录

WebView与APP交互

WebView与APP交互,即网页经由历程JSBrige挪用APP的功用,APP也能够经由历程JSBrige挪用网页供应的要领。近来恰好打仗到这一块,纪录一下前端侧的现实操作历程,这篇文章合适还没打仗过这一块的同砚们,这里不讲原理,直接最先实战的历程。

准备工作

与客户端同砚沟通好运用的JSBrige库,我这里运用的是下面这两个库:

iOS(1.1w+ Star): https://github.com/marcuswestin/WebViewJavascriptBridge

Android(6k+ Star): https://github.com/lzyzsd/JsBridge

Star数目比较高,运用的企业也比较多,所以照样比较牢靠的,能够在它们的文档中示例代码。

注重: github上有许多如许的库,但最好配套运用,即iOS和Android注入的jsBrige称号一致,我们前端运用时比较轻易一致。

开辟步骤

1. 一致封装APP注入的JSBrige

ios和android注入的jsbrige能够会有些差别,所以在运用前我们须要抹平差别客户端的差别。
假如app的同砚运用了上面说的库,安卓和iOS会在WebView中的window下注入一个WebViewJavascriptBridge的对象,iOS有多是注入WVJBCallbacks的数组,也有能够须要经由历程iframe来注入。iOS的文档中给出了一个兼容的示例代码:

function setupWebViewJavascriptBridge(callback) {
if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
window.WVJBCallbacks = [callback];
var WVJBIframe = document.createElement('iframe');
WVJBIframe.style.display = 'none';
WVJBIframe.src = 'https://__bridge_loaded__';
document.documentElement.appendChild(WVJBIframe);
setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
}

我们能够直接运用上面的代码,为了运用轻易,在页面onload后,我们将这个函数挂在window下:

window.Onload= function () {
function setupWebViewJavascriptBridge(callback) {
if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
window.WVJBCallbacks = [callback];
var WVJBIframe = document.createElement('iframe');
WVJBIframe.style.display = 'none';
WVJBIframe.src = 'https://__bridge_loaded__';
document.documentElement.appendChild(WVJBIframe);
setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
}
window.setupWebViewJavascriptBridge = setupWebViewJavascriptBridge
}

window.setupWebViewJavascriptBridge这个函数,就是我们所说的JSBridge,即WebView与APP交互的桥梁。

2. JS挪用APP的要领

APP端的同砚须要先用库供应的要领在APP端完成一个要领,要领名比方:playMusic(musicId),能够通报参数musicId,示意让APP最先播放某一首音乐。js挪用时如:

window.setupWebViewJavascriptBridge(function (bridge) {
bridge.callHandler('playMusic', { musicId: 1 }, function (data) {
console.log('app触发胜利了,音乐正在播放。。。APP回调返回的数据:', data)
})
})

上面相当于向app发起了一个playMusic要求,app收到要求后,实行相干的行动,然后能够callback,网页能够拿到回调并继承做相干行动(须要的话)。

3. APP调JS供应的要领

一样的原理,若想APP能挪用JS供应的要领,JS中要先注册这个要领,要领名比方stateChange(state),JS注册要领:

window.setupWebViewJavascriptBridge(function (bridge) {
bridge.registerHandler('stateChange', function (data, responseCallback) {
console.log('收到APP要求stateChange事宜,要求的数据是:', data)
// 能够返回给app一个回调
responseCallback('朕已收到APP爱卿的要求了,且退下!')
})
})

到这里,WebView与app的交互实在就完成了,就是这么简朴。

注重事项

1. window.onload时就callHandler能够不胜利

平常在Android中会涌现这个题目,这是由于APP注入的WebViewJavascriptBridge还不存在,JS就挪用个中的要领了,所以就会没有结果。而Android的库也给出了这个注重事项,所以得如许写:

window.Onload= function () {
function registerAppEvent () {
window.setupWebViewJavascriptBridge(function (bridge) {
bridge.registerHandler('stateChange', function (data, responseCallback) {
console.log('收到APP要求,要求的数据是:', data)
// 能够返回给app一个回调
responseCallback('朕已收到APP爱卿的要求了,且退下!')
})
})
}
// 兼容写法
if (window.WebViewJavascriptBridge) {
registerAppEvent()
} else {
document.addEventListener(
'WebViewJavascriptBridgeReady'
, function() {
registerAppEvent()
},
false
)
}
}

但这里没有考虑到iOS的状况,在最新的iOS中WebViewJavascriptBridge多是不存在的,所以上面写法registerAppEvent()在iOS能够没法实行。为了防止屡次注入事宜,我这里用了setTimeout,兼容两头的流程:

let isInitBridgeEvent = false // 作为是不是已注册过事宜的标记
if (window.WebViewJavascriptBridge) {
registerAppEvent()
isInitBridgeEvent = true
} else {
document.addEventListener(
'WebViewJavascriptBridgeReady',
function () {
registerAppEvent()
isInitBridgeEvent = true
},
false
)
// 假如还没注册则再注册一次
setTimeout(() => {
if (!isInitBridgeEvent) {
registerAppEvent()
isInitBridgeEvent = true
}
}, 100)

这坨代码写的很挫,让我为难癌都犯了,有无热情的小伙伴帮我优化下写法[送花花]。

2. js挪用安卓后callback回调不胜利,js收不到app返回的音讯

这个题目实在github上有issue,这是安卓1.0.4版本没有处理的题目,最新的代码已处理了。
处理办法是:安卓须要引入最新的master的代码,而不要运用1.0.4版本的代码。


推荐阅读
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • JavaScript XML操作实用工具类:XmlUtilsJS技巧与应用 ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • 本文介绍了如何利用HTTP隧道技术在受限网络环境中绕过IDS和防火墙等安全设备,实现RDP端口的暴力破解攻击。文章详细描述了部署过程、攻击实施及流量分析,旨在提升网络安全意识。 ... [详细]
  • 在PHP中如何正确调用JavaScript变量及定义PHP变量的方法详解 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • 在 Axublog 1.1.0 版本的 `c_login.php` 文件中发现了一个严重的 SQL 注入漏洞。该漏洞允许攻击者通过操纵登录请求中的参数,注入恶意 SQL 代码,从而可能获取敏感信息或对数据库进行未授权操作。建议用户尽快更新到最新版本并采取相应的安全措施以防止潜在的风险。 ... [详细]
  • 本文探讨了使用JavaScript在不同页面间传递参数的技术方法。具体而言,从a.html页面跳转至b.html时,如何携带参数并使b.html替代当前页面显示,而非新开窗口。文中详细介绍了实现这一功能的代码及注释,帮助开发者更好地理解和应用该技术。 ... [详细]
  • 本文详细探讨了使用纯JavaScript开发经典贪吃蛇游戏的技术细节和实现方法。通过具体的代码示例,深入解析了游戏逻辑、动画效果及用户交互的实现过程,为开发者提供了宝贵的参考和实践经验。 ... [详细]
  • 本文详细探讨了 jQuery 中 `ajaxSubmit` 方法的使用技巧及其应用场景。首先,介绍了如何正确引入必要的脚本文件,如 `jquery.form.js` 和 `jquery-1.8.0.min.js`。接着,通过具体示例展示了如何利用 `ajaxSubmit` 方法实现表单的异步提交,包括数据的发送、接收和处理。此外,还讨论了该方法在不同场景下的应用,如文件上传、表单验证和动态更新页面内容等,提供了丰富的代码示例和最佳实践建议。 ... [详细]
  • 本文深入探讨了JavaScript中`this`关键字的多种使用方法和技巧。首先,分析了`this`作为全局变量时的行为;接着,讨论了其在对象方法调用中的表现;然后,介绍了`this`在构造函数中的作用;最后,详细解释了通过`apply`等方法改变`this`指向的机制。文章旨在帮助开发者更好地理解和应用`this`关键字,提高代码的灵活性和可维护性。 ... [详细]
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
  • 本文总结了JavaScript的核心知识点和实用技巧,涵盖了变量声明、DOM操作、事件处理等重要方面。例如,通过`event.srcElement`获取触发事件的元素,并使用`alert`显示其HTML结构;利用`innerText`和`innerHTML`属性分别设置和获取文本内容及HTML内容。此外,还介绍了如何在表单中动态生成和操作``元素,以便更好地处理用户输入。这些技巧对于提升前端开发效率和代码质量具有重要意义。 ... [详细]
author-avatar
猥琐叔装嫩小孩
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有