iOS小技能:和uni-app、unity的融合方案
本文正在參加「金石計劃」
引言
專案背景: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工程(需要將匯出的工程封裝為靜態庫)https://zhuanlan.zhihu.com/p/103759507 、https://www.jianshu.com/p/00dcac5b2fb2
思路3: Unity3D 嵌入iOS原生程式碼https://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執行原理
https://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端執行時,從架構上分為邏輯層和檢視層兩個部分。
- 邏輯層負責執行業務邏輯,也就是執行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 的裝置
https://developers.google.cn/ar/devices#android_china
4.2 uni-app和原生App混合開發問題
首先務必確認uni-app和原生程式碼,誰是主誰是從的問題。
https://uniapp.dcloud.io/hybrid.html
- 如果你的應用是uni-app開發的,需要擴充套件一些原生能力,那麼首先去外掛市場看看有沒有現成的外掛,如果沒有,就自己開發原生外掛。
- 如果你的App是原生開發的,部分功能欄目想通過uni-app實現,有2種方式: a. 在原生App裡整合uni小程式sdk,然後即可執行用uni-app框架開發的小程式前端專案(小程式應用資源包wgt)。https://nativesupport.dcloud.net.cn/README b. 如果不想整合原生sdk,那就把uni-app程式碼釋出成H5方式,在原生App裡通過webview開啟。
see also
公眾號:iOS逆向
- iOS小技能:UITableView的適配 (iOS10/iOS14/iOS16.0)
- iOS小技能:和uni-app、unity的融合方案
- iOS小技能:iOS15崩潰排查技巧(symbolicatecrash符號化分析問題、匯出和隱藏符號)
- iOS小技能:【intercept the HTTP/HTTPS requests 】利用NSURLProtocol 攔截請求
- iOS小技能: tweak 整合CocoaAsyncSocket(建連、斷開、重連、心跳、通用請求)
- iOS小技能:iOS13 證件掃描 & 文字識別API
- iOS小技能:整合下拉重新整理控制元件 & 實現無感知上拉載入更多
- iOS小技能:程式碼觸發button的點選事件、快速找到按鈕action方法
- iOS小技能:撥號、發郵件、簡訊、應用間跳轉
- iOS小技能:鏈式程式設計在iOS開發中的應用
- iOS小技能:iOS14 讀取使用者剪下板資料彈出提示的相容方案
- iOS小技能:因境外IP無法訪問導致 App 被拒的解決方案
- iOS小技能:RSA簽名、驗籤、加密、解密的原理
- iOS小技能:Xcode14新特性(適配)
- iOS小技能:Socket基礎知識
- iOS小技能:SKU檢視搭建
- iOS小技能: 日曆的使用(案例:兩個時間的比較、獲取最近30天的資料)
- iOS小技能:1. iOS 實現json資料提交 2. 對同一個URL的多次請求進行資料快取 3. 檢查網路狀態
- iOS小技能:使用正則表示式對聊天記錄的關鍵詞進行監控
- iOS小技能:去掉/新增導航欄黑邊(iOS13適配)