本文正在参加「金石计划」
引言
项目背景:iOS app内嵌H5和 AR功能,AR使用unity2020开发。
技术点:unity导出的目标工程Unity-iPhone.xcodeproj
与原生进行融合
目前的方案:uniapp 桥接IOS, ios 桥接unity, uniapp 采用插件的形式进行iOS原生代码开发, 然后集成为ipa文件。
I 实现思路
思路1: uniapp 桥接IOS,ios 桥接unity,然后集成为ipa文件。
Unity发布到iOS平台得到的是一个Xcode工程,uniapp 这边是个本地资源包。
思路2: 原生APP集成Unity导出的Xcode工程(需要将导出的工程封装为静态库)zhuanlan.zhihu.com/p/103759507 、www.jianshu.com/p/00dcac5b2…
思路3: Unity3D 嵌入iOS原生代码www.jianshu.com/p/82e34d9a1…
思路4: Unity导出的web工程部署到服务器,原生APP加载对应的H5地址。(视加AR不支持导出Web)
小程序的AR是图片识别,视加AR是空间识别; 小程序是在屏幕上,app可以做到3D的跟随图片。
如果有更好的思路和相关文章,欢迎留言交流。
II 桥接
2.1 IOS中调用Unity的方法
在这里插入图片描述
使用unityengine.dll提供的C接口UnitySendMessage 第1个char* 表示接受该消息的GameObject的name, 第2个表示该GameObject的脚本中接受消息的函数名, 第3个表示传递的参数。
//参数1 场景中模型的名字
//参数2 脚本名称方法
//参数3 想unity传递一个char类型的数据
UnitySendMessage("iOSSendMessageToUnity", "ChangeCameraDirection", "");
结合后unity里面的你先打开后是进入这个场景(SelectScene) 物体名SceneManager 脚本名SceneSelect 函数ChangeScene(string str) 传参数ZhenWuMiaoAR就是真武庙;或者传参数modelShow就是沙盘。
2.2 uniapp 桥接iOS
除了 uni-app 框架内置的跨端 API,各端自己的特色 API 也可通过条件编译 自由使用。因此uniapp可直接使用原生API进行发布通知,实现通信。
在这里插入图片描述
III uni-app运行原理
kunnan.blog.csdn.net/article/det…
3.1 js引擎
浏览器的js引擎,就是jscore或v8的基础上新增了一批浏览器专用API,比如dom;
node.js引擎,则是v8基础上补充一些电脑专用API,比如本地io;
uni-app的App端和小程序端的js引擎,其实是在jscore上补充了一批手机端常用的JS API,比如扫码。
3.2 运行原理
uni-app 在非H5端运行时,从架构上分为逻辑层和视图层两个部分。
- 逻辑层负责执行业务逻辑,也就是运行js代码。
逻辑层是运行在一个独立的jscore里的,它不依赖于本机的webview,所以一方面它没有浏览器兼容问题,可以在Android4.4上跑es6代码,另一方面,它无法运行window、document、navigator、localstorage等浏览器专用的js API。
- 视图层负责页面渲染。
h5和小程序平台,以及app-vue,视图层是webview。
而app-nvue的视图层是基于weex改造的原生渲染视图。
3.3 编译器
vue2:uni-app编译器基于wepback实现
vue3:uni-app编译器基于Vite实现,编译速度更快
HBuilderX 3.3.0+ , uni-app在App/H5/小程序全平台支持Vue 3.0开发,且全平台支持Vite编译器。
Webpack1
|
|
Rollup 出现(推崇 ESM 规范,可以实现 tree shaking, 打包出来的代码更干净)
|
|
Webpack2(也实现了 tree shaking, 但是配置还是太繁琐了)
|
|
Parcel (号称 0 配置)
|
|
Webpack4(通过 mode 确定 development 和 production 模式,各个模式有自己的默认配置)
|
|
Webpack5(持久化缓存、module federation)
|
|
Esbuild(采用 go 语言开发,比 Webpack 更快)
|
|
Vite(推崇 ESM 规范,开发模式采用 nobundle,更好的开发体验)
组件模块化成为前端开发的主流模式,以 React 和 Webpack 为例:将一个应用涉及到的所有的功能拆分为一个个组件,一个组件对应一个源文件,然后通过 Webpack 将这些源文件打包。在开发过程中,可通过 Webpack 开启一个 local server,实时查看代码的运行效果。
IV 常见问题
4.1 支持 ARCore 的设备
developers.google.cn/ar/devices#…
4.2 uni-app和原生App混合开发问题
首先务必确认uni-app和原生代码,谁是主谁是从的问题。
- 如果你的应用是uni-app开发的,需要扩展一些原生能力,那么首先去插件市场看看有没有现成的插件,如果没有,就自己开发原生插件。
- 如果你的App是原生开发的,部分功能栏目想通过uni-app实现,有2种方式: a. 在原生App里集成uni小程序sdk,然后即可运行用uni-app框架开发的小程序前端项目(小程序应用资源包wgt)。nativesupport.dcloud.net.cn/README b. 如果不想集成原生sdk,那就把uni-app代码发布成H5方式,在原生App里通过webview打开。
see also
公众号:iOS逆向