5+app 与 uniapp

3,952 阅读3分钟

1,5+app 与 uniapp

WebView

在原生的 App 中,使用 WebView 作为容器直接承载 Web页面。

JSBridge

最核心的点就是 Native端 与 H5端 之间的双向通讯层,其实这里也可以理解为我们需要一套跨语言通讯方案,来完成 Native(Java/Objective-c/...) 与 JavaScript 的通讯。

2,uniapp跨端原理

uni-app分编译器运行时(runtime)。uni-app能实现一套代码、多端运行,是通过这2部分配合完成的。

编译器将开发者的代码进行编译,编译的输出物由各个终端的runtime进行解析,每个平台(Web、Android App、iOS App、各家小程序)都有各自的runtime

编译器

开发者按uni-app规范编写代码,由编译器将开发者的代码编译生成每个平台支持的特有代码。
在 C 语言中,通过 #ifdef、#ifndef 的方式,为 windows、mac 等不同 os 编译不同的代码。 参考这个思路,uni-app提供了 条件编译手段,在一个工程里优雅的完成了平台个性化实现

<!--  #ifdef %PLATFORM% -->
平台特有的组件
<!--  #endif -->
  • 在web平台,将.vue文件编译为js代码。与普通的vue cli项目类似

  • 在微信小程序平台,编译器将.vue文件拆分生成wxml、wxss、js等代码

  • 在app平台,将.vue文件编译为js代码。在app端,还支持原生渲染的nvue,以及可以编译为kotlin和swift的uts

    • 在Android平台,将.uts文件编译为kotlin代码
    • 在iOS平台,将.uts文件编译为swift代码

运行时 runtime

uni-app在每个平台(Web、Android App、iOS App、各家小程序)都有各自的runtime。这是一个比较庞大的工程。

  • 在小程序端,uni-app的runtime,主要是一个小程序版的vue runtime,页面路由、组件、api等方面基本都是转义。
  • 在web端,uni-app的runtime相比普通的vue项目,多了一套ui库、页面路由框架、和uni对象(即常见API封装)
  • 在App端,uni-app的runtime更复杂,可以先简单理解为DCloud也有一套小程序引擎,打包app时将开发者的代码和DCloud的小程序打包成了apk或ipa。当然,事实上DCloud确实有小程序引擎产品,供原生应用实现小程序化,详见

uni-app runtime包括3部分:基础框架、组件、API。

3,uniapp app原生能力

  • App 端内置 HTML5+ 引擎
plus.runtime.appid
  • Native.js技术,简称NJS,是一种将手机操作系统的原生对象转义,映射为JS对象,在JS里编写原生代码的技术
// iOS平台导入NSNotificationCenter类
var NSNotificationCenter = plus.ios.importClass("NSNotificationCenter");

// Android平台导入Intent类
var Intent = plus.android.importClass("android.content.Intent");
  • renderjs是一个运行在视图层的js
<script module="echarts" lang="renderjs">
	let myChart
	export default {
		mounted() {
			if (typeof window.echarts === 'function') {
				this.initEcharts()
			} else {
				// 动态引入较大类库避免影响页面展示
				const script = document.createElement('script')
				// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
				script.src = 'static/echarts.js'
				script.onload = this.initEcharts.bind(this)
				document.head.appendChild(script)
			}
		},
		methods: {
			initEcharts() {
				myChart = echarts.init(document.getElementById('echarts'))
				// 观测更新的数据在 view 层可以直接访问到
				myChart.setOption(this.option)
			},
			updateEcharts(newValue, oldValue, ownerInstance, instance) {
				// 监听 service 层数据变更
				myChart.setOption(newValue)
			},
			onClick(event, ownerInstance) {
				// 调用 service 层的方法
				ownerInstance.callMethod('onViewClick', {
					test: 'test'
				})
			}
		}
	}
</script>
  • 原生插件
  • uts,全称 uni type script,主要分为插件和组件应用。

它可以被编译为不同平台的编程语言,如:

  • web平台,编译为JavaScript
  • Android平台,编译为Kotlin
  • iOS平台,编译为Swift(HX 3.6.7+ 版本支持)
// --- index.uts 插件
// 引用android api
import Context from "android.content.Context";
import BatteryManager from "android.os.BatteryManager";
import { UTSAndroid } from "io.dcloud.uts";

export function getBatteryCapacity(): string {
	// 获取android系统 application上下文
    const context = UTSAndroid.getAppContext();
    if (context != null) {
        const manager = context.getSystemService(
            Context.BATTERY_SERVICE
        ) as BatteryManager;
        const currentLevel: number = manager.getIntProperty(
            BatteryManager.BATTERY_PROPERTY_CAPACITY
        );
        return '' + currentLevel + '%';
    }
    return "0%";
}


import getBatteryCapacity from "@/uni_modules/uts-getbatteryinfo";
console.log(getBatteryCapacity())

推荐

欢迎关注我的前端自检清单,我和你一起成长