跨平台一般来说必须包含三个方面:
- UI跨平台
即使用同一套UI布局或代码,能使其在不同的平台上的外观及对应的UI操作,比如:页面切换、点击、滑动等操作,表现一致 - 原生系统功能跨平台
即使用统一的API能在不同的平台上唤起对应的平台特有的功能
比如:拍照、文件存储、设备信息 - 实现成本比各个平台分别实现的成本低
否则何必舍近求远
大概有以下几种实现方式:
利用编译过程,将代码编译为各平台的语言- 使用一套底层的库,将页面画在原生系统的视图层
- 利用系统的公用组件或公用库
- 通过库打通到各类平台的语言间的桥梁
以下详细分析每一种方式的可行性
一 利用编译过程,将代码编译为各平台的语言
首先编译的目标肯定是对应系统架构的应用层
1. Android主要为Java、Kotlin
2. IOS主要为Objective-c、Swift
(不同的手机厂商对应的framework层都可能存在差异,适配的难度太大,不大可能拿到所有手机厂商间的差异 )
既然是编译为对应平台的语言,那么“UI跨平台”与“原生系统功能跨平台”都是通过编译之后的原生系统的代码来实现的,但是各平台间各平台间应用层接口差距也太大了,例如需要实现一个拍照方法:
- Android上需要使用
AndroidManifest
文件配置相机使用权限,为相机预览使用一个SurfaceView
、并使用Java的Camera
打开相机并拍照 - IOS上需要通过配置
*-Info.plist
文件配置相关权限,并使用AVFoundation
设置信息并实现拍照
以此可见,仅仅拍照功能,各平台的应用层的实现方式差异实在太大,因此直接通过编译的方式,将代码编译为各类语言再运行的方式将造成 实现成本远远超出了两个平台分别实现的成本 而且随着平台数目的扩展,代价一定是指数级的攀升,因此并不可取
二 使用一套较为底层的库,将页面画在原生系统的视图层
- UI跨平台
因为UI直接是使用的统一的库在页面上画出来的,因此外观与UI操作能够实现统一了 - 原生系统功能跨平台
可以通过在库中统一封装一套对应的API接口来处理不同系统的功能
三 利用系统的公用组件或公用库
webview
即是一个天然的每个系统都存在的跨平台的组件,虽说每个系统使用的webview
不尽相同,但是以webview
为基础的通用的api却大同小异,而且还有web标准或协议来限制不同平台的webview
的差异,因此能在pc浏览器运行的web程序,能很快的移植到各个平台上并且保证其UI外观以及操作的一致性
而且各个平台可以通过webview做为载体,打通javascript与平台的桥梁,实现双向数据传递,因此定义好了各类原生系统的功能的接口之后,可以通过JavaScript来调用各个接口实现原生系统功能的调用
cordova
即是以此方式实现的
四 通过库打通到各类平台的语言间的桥梁
以第三种方式为启发,若能直接打通两类语言之间的桥梁,实现数据的双向互传,那么无论是UI还是系统功能的调用都能通过定义好的接口协议来进行操作了,因此也有了VirtualDom
的出现,VirtualDom
只是一种定义好的数据结构,各个平台对于VirtualDom
都有其自己的一套展示以及操作的方法,因此只要我们定义好了VirtualDom
然后将其传到对应的平台上,通过不同平台上对应VirtualDom
的相应实现就能得到不同平台上的相同的UI以及UI操作的展示了,原生系统功能的跨平台也能像第三种方式一样实现了
Facebook 的 React Native(基于React)、阿里巴巴的 Week(基于Vue)即是以类似方式实现
五 未来可能存在的方案
技术不断在发展,因此还可能存在其他的方式等待未来分晓了
作者:如羽灬 一个热爱技术的大前端开发者和架构师
个人网站:https://www.wanyan.site/