Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >混合开发hybrid原理_unity引擎开源吗

混合开发hybrid原理_unity引擎开源吗

作者头像
全栈程序员站长
发布于 2022-11-09 03:30:27
发布于 2022-11-09 03:30:27
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
首先,我们先来罗列一下当前市面上,移动端的各种开发方法

1.Native App

纯原生的app开发模式,android(Java)或者ios(Swift,Oc)

优点:

有最好的性能,有最好的体验

缺点:

开发和发布的成本极高,两端需要不同的技术人员来维护,原生开发人员非常的稀缺

2.WebApp

移动端运行在浏览器上的网站,我们一般称之为H5应用,就是泛指我们经常开发的spa,map页面

语言:js,vue,react,angular等

优点:

1.开发和发布非常方便 2.用户看到的页面,会随着开发人员的发布实时更新 3.可以跨平台,因为H5应用的产出其实就是一个url,测试非常的方便,chrome safari f12 4.不存在多版本的问题,维护成本很低

缺点:

1.性能和体验一般 2.受限于浏览器,能做的事情并不是很多,需要兼容各种奇怪的浏览器 3.入口强依赖浏览器

3.React Navite App / Weex App / Uniapp

都是为了跨平台而生的,支持react/vue的语法

4.Flutter

闲鱼使用flutter开发。dart语言,跨平台支持的更好

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
然后是Hybrid基本介绍

h5+native 混合开发 = hybrid

app -> webview ->url === hybrid??

最大的特点是h5和native可以双向交互

例:通过微信JSSDK介绍Hybrid

h5经常分享在微信聊天/朋友圈

公众号文章 -> … ->分享给好友

授权 -> 是否同意授权xxxx ->头像昵称 ->手机号

分享,支付,位置。h5开发者只需要关注微信jssdk提供了哪些api即可,其他的事情都由jssdk和微信客户端来完成

Hybrid开发架构

hybrid最核心的部分,就是native和h5的双向通讯。通讯是完全依赖于webview容器

但是有两个问题

1.具体的通讯形式又是什么样子的呢? 2.webview凭什么可以支持起native和h5的双向通讯

双向通讯市面上目前有两种方式:

1.URL schema,客户端通过拦截webview中的请求来完成通讯 2.native向webview的js执行环境中,给window对象挂在api,以此来完成通讯

原理

在webview中发出的网络请求,都会被客户端给监听到 这就是URL Schema这种模式实现的最基本基石

定义自己的私有协议

h5里面可能有无数的请求,怎么判断哪个请求需要调用内置方法呢?

1.native可以定义自己的私有协议,例如hahah://

2.随后我们在webview中如果去调用native的一些端能力,就需要在请求前面拼上这个协议头,比如我们请求是http://gogoing,就要变成hahaa://+我们的请求

3.协议的名称是自定义的,没什么特别硬性的要求,只要和native协商好就可以

请求的发送

1.iframe的方式

…js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const doc = window.document
const body = doc.body

const iframe =  doc.createElement('iframe')
iframe.style.display = 'none' //不显示出来
iframe.src = 'hahah://googing'   //此时还没有开始请求

body.appendChild(iframe)

setTimeout(()=>{
body.removeChild(iframe)
})

客户端要考虑的还有安全方面,还会设置一些域名的白名单

2.locaiton.href(不适用于并行的请求 setLeft setRight)

客户端拦截协议请求

当拦截到的请求是约定好的,会解析参数,解析方法,进行相关的native操作

请求处理完成后的回调

webview请求本质上还是一个异步请求,我们需要有一个回调来告诉我们请求的结果

window.addEventListener和window.dispatchEvent这两个api

业务中:

…js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
webview.setTitle({title:'哈哈哈哈'},(err,response)=>{
if(err){
console.error(err);
return;
}
//执行成功,执行业务逻辑
})

JSBridge中:

…js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const handleId = 1;
const eventName = `setTitle_${handlerId}`; //每一个eventName唯一
handleId++;
const event = new Event(eventName);
window.addEventListener(eventName,(res)=>{
(res.data.errcode){
//执行失败
return
}
//执行成功
})	;

JsBridge.send();
event.data = {errcode:0 }
window.dispatchEvent(event)

注入API

上面方法是通过iframe来发送请求,参数很容易过长而被截断

1.h5向native传递信息

前提是:native已经向window变量注入了各种api,咱们已经可以直接调用它们了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
比如window.QiukuWebview = {setTile : xxxx }

...js

window.QiukuWebview.setTitle(params)

2.准备接收native的回调

…js

window[‘setTitle_callback_1’] = (err code,response) =>{

}

有可能有的公司为了安全性,会对参数进行加密或者编码

3.native调用回调函数

native执行完之后,应该怎么告诉h5我执行完了呢?我应该调用哪个函数告诉h5呢?

…js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
window.QiukuWebview.setTitle(params);

…js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const callbackName = 'setTitle_callback_1';
window.QiukuWebview.setTitle({
trigger:callbackName,
...params
})

window['setTitle_callback_1'] = (err code,response) =>{
}

为了保证callback的唯一性,一般会加入各种Date.now()+id

h5在app内的运行方式

1.app的webview直接加载一个h5链接

缺点:

没有太好的体验,除了能用一些native的能力之外,和普通浏览器打开h5没什么区别,因为加载的还是网络资源

优点:

灵活,易用

2.app内置h5资源

优点:

首屏加载速度特别快,体验接近原生 可以不依赖网络,离线运行

缺点:

会增大app的体积 需要多方合作区完成方案

但是要解决的最核心问题是:如何更新内置的h5资源

开发中的常见问题

1.ios webview中滑动不流畅

如果有一个滚动容器 scroll-container , overflow:scroll

加一个css属性即可

-webkit-overflow-scrolling:touch;//控制ios中的惯性滚动

2.滚动穿透

背景页面有滚动的时候,此时有个弹窗出现了,你的手指在弹窗上滑动,你的背景也会跟着滑动。

2.1 弹窗内无滚动,背景页面有滚动

直接在弹窗容器元素上加一个监听事件就可以了

…js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
document.addEventListener('touchmove',function(e){
//阻止默认事件
e.preventDefault()
})

如果是vue写的,直接加一个 @touchmove.prevent

2.2 弹窗内有滚动,背景页面有滚动

要实现的是: 弹窗出现时,背景禁止滚动 弹窗隐藏时,背景恢复滚动

vue里面只适用于v-if,v-show不行

…js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const inserted = () =>{
   //弹窗出现的行为
   const scrollTop = document.body.scrollTop || document.documentElement.scrollTop
   document.body.style.cssText +=`position : fixed ; width:100%;top:-${scrollTop}px;`;
}

const unbind = () =>{
  const body = document.body || document.documentElement
  body.style.position = '';
  const top = body.style.top;
  document.body.scrollTop = document.documentElement.scrollTop = -parseInt(top,10);
  body.style.top = '';
}

export const vScroll = {
   inserted,
   unbind
}

然后注册

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Vue.directive('scroll',vScroll)

比如在一个div元素上用的时候

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
div(v-scroll)

3.刘海屏幕的安全区域留白

设置viewport-fit cover

…html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<meta name="viewport" content="viewport-fit=cover">

默认有一个div

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
div{
position:fixed;
bottom:0;
//加这2个属性,记住顺序不要颠倒,兼容性问题
bottom:calc(constant(safe-area-inset-bottom)+0);
bottom:calc(env(safe-area-inset-bottom)+0);
}

如果bottom设置一个变量的话

@bottom-height:1rem

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
div{
position:fixed;
bottom:@bottom-height;
//加这2个属性,记住顺序不要颠倒,兼容性问题
bottom:calc(constant(safe-area-inset-bottom)+@bottom-height);
bottom:calc(env(safe-area-inset-bottom)+@bottom-height);
}

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

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/190525.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月22日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
吃透移动端 H5 与 Hybrid|实践踩坑12种问题汇总
作为一个开发了多个 H5 项目的前端工程师,在开发过程中难免会遇到一些兼容性等爬过坑的问题。现在我将这些问题一一汇总一下,并在后面给出坑产生的原理,和现阶段常规的填坑方案。由此来做一个阶段性的总结。
前端老道
2020/10/15
1.4K0
吃透移动端 H5 与 Hybrid|实践踩坑12种问题汇总
吃透移动端 H5 与 Hybrid|实践踩坑12种问题汇总
作为一个开发了多个 H5 项目的前端工程师,在开发过程中难免会遇到一些兼容性等爬过坑的问题。现在我将这些问题一一汇总一下,并在后面给出坑产生的原理,和现阶段常规的填坑方案。由此来做一个阶段性的总结。
前端迷
2020/02/19
2.2K0
吃透移动端 H5 与 Hybrid|实践踩坑12种问题汇总
浅谈Hybrid
随着 Web 技术和移动设备的飞速发展,各种 APP 层出不穷,极速的业务扩展提高了团队对开发效率的要求,这个时候使用 IOS/Andriod 开发一个 APP 似乎成本有点过高了,而 H5 的低成本、高效率、跨平台等特性马上被利用起来形成了一种新的开发模式:Hybrid APP。
前端森林
2020/04/23
7.1K0
浅谈Hybrid
12个关于移动 H5 开发的采坑问题汇总
作为一个开发了多个 H5 项目的前端工程师,在开发过程中难免会遇到一些兼容性等爬过坑的问题。现在我将这些问题一一汇总一下,并在后面给出坑产生的原理,和现阶段常规的填坑方案。由此来做一个阶段性的总结。
前端达人
2021/10/08
1.8K0
12个关于移动 H5 开发的采坑问题汇总
看完就懂的Hybrid框架设计方案
本篇文章探讨“基于 Webview,如何在 App 内实现带离线包能力的 H5”。在当下这个主题似乎有些过时,但 H5 技术以其良好的跨端一致性,长期来看会占据一席之地,希望整理一个较完整的方案,从基本的实现原理到业务具体应用,让不了解的同学对“离线 H5"有一个较完整的视角。
腾讯云开发者
2024/04/12
2.6K0
看完就懂的Hybrid框架设计方案
探究Hybrid-APP技术原理
随着Web技术的发展和移动互联网的发展,Hybrid技术已经成为一种前端开发的主流技术方案。那什么是Hybrid App呢?
Tiffany_c4df
2019/09/04
9500
Hybrid前端jsbridge设计原理分析
预先定义好schema,如myapp://... 通过前端发送伪连接请求iframe.src
kimihe
2020/03/28
1.8K0
移动端必备的H5问题及解决方案
上下滑动页面会产生卡顿,手指离开页面,页面立即停止运动。整体表现就是滑动不流畅,没有滑动惯性。
前端小tips
2021/12/11
5K0
移动端必备的H5问题及解决方案
利用Vue自定义指令让你的开发变得更优雅
前段时间在用框架开发H5页面时,碰到框架中的组件内置了一个属性用于适配异形屏,虽然是组件内部实现的,但这个方式让我萌生一个想法:能不能自己写一个属性来实现这样的功能?
茶无味的一天
2022/10/05
4500
利用Vue自定义指令让你的开发变得更优雅
Hybrid App技术解析 -- 原理篇
引言 随着 Web 技术和移动设备的快速发展,Hybrid 技术已经成为一种最主流最常见的方案。一套好的 Hybrid架构方案 能让 App 既能拥有极致的体验和性能,同时也能拥有 Web技术 灵活的
前端教程
2018/07/27
1.7K0
Hybrid App技术解析 -- 原理篇
📚一站式解决:H5开发全攻略,看这篇让你省时又省力
在 H5 中,我们通常会使用 REM 和 VW 这两种单位来实现页面的响应式布局。这两种单位可以让页面元素的大小随着根元素(对于 REM)或视口宽度(对于 VW)的大小变化而变化,从而适应不同尺寸的屏幕。
linwu
2023/07/27
1.2K0
Hybrid App 应用开发中 5 个必备知识点复习
前言 我们大前端团队内部 📖每周一练 的知识复习计划还在继续,本周主题是 《Hybrid APP 混合应用专题》 ,这期内容比较多,篇幅也相对较长,每个知识点内容也比较多。 之前分享的每周内容,我都整理到掘金收藏集 📔《EFT每周一练》 上啦,欢迎点赞收藏咯💕💕。 注:本文整理资料来源网络,有些图片/段落找不到原文出处,如有侵权,联系删除。 一、什么是 Hybrid App,与 Native App 及 Web App 有什么区别 参考文章: 《Web App Hybrid App和 Native Ap
pingan8787
2019/09/05
2.4K0
Hybrid App 应用开发中 5 个必备知识点复习
3.1、我们的JSBridge
公司研发的一款服务软件App(姑且称为“大地”),提供了包涵消息、待办、工作台、同事圈和通讯录五大功能模块,其中,工作台里集成了包括公司的移动客户端、PC端以及第三方平台的部分功能/服务(统称为“应用”)。
甜点cc
2022/10/05
1.1K0
3.1、我们的JSBridge
解耦---Hybrid H5跨平台性思考
跨平台,是H5最重要的能力之一。而 Hybrid H5 因强依赖于具体 app,往往不具有跨平台性。这时,将强依赖关系解耦,即可恢复 H5 的跨平台能力。近期本人负责 手Q 红包打赏项目的前端开发,因项目涉及到多 app 跨平台兼容,对 hybrid H5 的跨平台性有了一定的感悟和思考。在这里做下总结分享,希望能对大家有所收获。 Hybrid H5 跨平台性 进入正题之前,先解释下本文主题的两个名词: ①Hybrid H5,即混合了原生能力的 H5。区别于纯粹 web 端的 H5,它可调用原生的能力,强依
腾讯Bugly
2018/03/23
1.6K0
解耦---Hybrid H5跨平台性思考
Android hybrid_android混合开发
简介: 混合开发(Hybrid)也有一段时间了,现在闲下来总结一下。 说到混合开发,重要功能有2种,一是网页端调用安卓原生接口或功能,二是安卓原生调用网页功能。
全栈程序员站长
2022/11/08
1.4K0
Android hybrid_android混合开发
一个 Hybrid SDK 设计与实现
随着移动浪潮的兴起,各种 App 层出不穷,极速发展的业务拓展提升了团队对开发效率的要求,这个时候纯粹使用 Native 开发技术成本难免会更高一点。而 H5 的低成本、高效率、跨平台等特性马上被利用起来了,形成一种新的开发模式:Hybrid App
IT大咖说
2021/07/19
1.4K0
开发 h5| Hybrid | 微信小程序 | 实践踩坑总结十六条
笔者最近一直在开发京东app嵌入的h5项目和微信小程序商城项目,在此期间遇到很多坑。这篇文章主要是针对 h5| Hybrid | 微信小程序 三个方向来讲述我遇到的坑,以及详细讲解我是如何解决问题的。
用户6835371
2021/06/01
2.7K0
开发  h5| Hybrid | 微信小程序 | 实践踩坑总结十六条
JS Bridge 通信原理
之前介绍了移动端开发的相关技术,这一篇主要是从 Hybrid 开发的 JS Bridge 通信讲起。
尹光耀
2022/03/22
5K0
JS Bridge 通信原理
混合开发Hybrid App为何成为热门?
纵观当前的移动开发,混合开发(Hybird App)的热度日益上升,那么是何原因导致这一趋势的呢?
Lydiasq
2022/11/22
6480
混合开发Hybrid App为何成为热门?
hybrid.js_js交互是什么意思
Hybrid App(混合模式移动应用)是指介于web-app、native-app这两者之间的app,兼具“Native App良好交互体验的优势”和“Web App跨平台开发的优势”。
全栈程序员站长
2022/11/09
10.6K0
hybrid.js_js交互是什么意思
推荐阅读
相关推荐
吃透移动端 H5 与 Hybrid|实践踩坑12种问题汇总
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验