iOS小技能:和uni-app、unity的融合方案

語言: CN / TW / HK

本文正在參加「金石計劃」

引言

專案背景: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工程(需要將匯出的工程封裝為靜態庫)http://zhuanlan.zhihu.com/p/103759507http://www.jianshu.com/p/00dcac5b2fb2

思路3: Unity3D 嵌入iOS原生程式碼http://www.jianshu.com/p/82e34d9a12b9

思路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執行原理

http://kunnan.blog.csdn.net/article/details/125975209

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端執行時,從架構上分為邏輯層和檢視層兩個部分。

  1. 邏輯層負責執行業務邏輯,也就是執行js程式碼。

邏輯層是執行在一個獨立的jscore裡的,它不依賴於本機的webview,所以一方面它沒有瀏覽器相容問題,可以在Android4.4上跑es6程式碼,另一方面,它無法執行window、document、navigator、localstorage等瀏覽器專用的js API。

  1. 檢視層負責頁面渲染。

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 的裝置

http://developers.google.cn/ar/devices#android_china

4.2 uni-app和原生App混合開發問題

首先務必確認uni-app和原生程式碼,誰是主誰是從的問題。

http://uniapp.dcloud.io/hybrid.html

  1. 如果你的應用是uni-app開發的,需要擴充套件一些原生能力,那麼首先去外掛市場看看有沒有現成的外掛,如果沒有,就自己開發原生外掛。
  2. 如果你的App是原生開發的,部分功能欄目想通過uni-app實現,有2種方式: a. 在原生App裡整合uni小程式sdk,然後即可執行用uni-app框架開發的小程式前端專案(小程式應用資源包wgt)。http://nativesupport.dcloud.net.cn/README b. 如果不想整合原生sdk,那就把uni-app程式碼釋出成H5方式,在原生App裡通過webview開啟。

see also

公眾號:iOS逆向