聊聊iOS端下uniAPP原生外掛是怎樣打包的?(打包流程分享)

2022-03-17 13:00:23
iOS端下uniAPP原生外掛是怎樣打包的?下面本篇文章就來帶大家聊聊iOS端下uniAPP 原生外掛打包流程,希望對大家有所幫助!

廢話開篇:uniAPP 打包採用的是雲編譯的方式,也就是說,appiOS 原生部分的程式碼需要提交到 uni 的後臺進行編譯,可以理解為在 uni 伺服器上有一個 Xcode 執行環境,當然雲端應該是用 Xcode 命令完成的,當 HBuilderX 進行雲編譯的時候,原生的所有原生庫會進行壓縮然後打包到雲端,最後,在將編譯好的 ipa 包下載到本地,這樣就可以安裝了。

一、靜態庫的設定

根據 uni 官網下載的 Demo 可以簡單的熟悉一下專案結構。

1.png

1、HBuilder-uniPlugin 主工程

它其實大致可以理解為雲端編譯時候雲端 Xcode 的全部編譯環境,為什麼這麼說呢?可以看一下這個工程的全部依賴。

2.png

單純原生的依賴項就多達 120+,因為,uni 有考慮雲編譯的成本,如果所有的庫都由開發者進行上傳,那麼編譯資源就會被大量佔用,於是就採用了遠端第三方庫儲備方式,這裡 uni 後臺也可以瞭解到。

iOS 端依賴的第三方庫版本說明

https://nativesupport.dcloud.net.cn/AppDocs/usemodule/iOSModuleConfig/dependentLibrary

3.png

所以,在進行 uni 原生外掛開發的時候,可以先參考一下遠端是否有支援的第三方,以免重複匯入出現編譯符號衝突的問題。

舉例說明:比如,外掛需要 B站 IJKMediaFramework 庫(160M左右,確實很大),那麼,先檢視雲端編譯是否有此庫,

4.png

發現已經存在,那麼,這時候,就不需要進行本地 IJKMediaFramework 庫提交了,只需要在 HBuilderXmanifest.json 設定下勾選 VideoPlayer 即可。

5.png

這樣 HBuilderXmanifest.json 的設定就會告訴雲編譯將 IJKMediaFramework 給加到工程裡來。

2、DCTestUniPlugin 靜態庫工程

在製作靜態庫的時候,這裡需要設定靜態庫架構的支援。

Build Setting -> Architectures 下進行設定

6.png

並注意在編譯的時候,選擇 Any iOS Device

7.png

靜態庫需要第三方庫怎麼辦?

在開發的時候肯定會遇到需要第三方庫支援的情況,比如:AFNetWorking,這裡先查閱了 uni 遠端是否支援,發現並沒有提高相應的靜態庫,那麼,就需要本地進行上傳。

因為,自制靜態庫最終是要載入到 APP 的環境中,所有,自制靜態庫依賴第三方的策略就是將第三方庫 .a 檔案 新增到 HBuilder-uniPlugin 主工程下,因為自制靜態庫需要標頭檔案引入,那麼,就在 DCTestUniPlugin 靜態庫工程下的 Heard Search Paths 加入標頭檔案的引入。

HBuilder-uniPlugin 主工程

8.png

DCTestUniPlugin 靜態庫工程 Heard Search Paths

9.png

二、設定 iOS 原生外掛 package.json

所有的功能都開發完畢了,下一步就是 本地外掛包設定

具體的打包步驟可以參考上面的連結,最後的檔案目錄結構如下:

10.png

1、WSLUniPlugin 是整體檔案,裡面可以包含 androidios(官網上為標註 ios 而不是 iOS

2、ios 檔案裡面包含全部需要的第三方庫及自制靜態庫。

3、package.json 是相關的設定,通過 package.json 內部資訊會告訴遠端編譯載入哪些庫及庫的資料夾位置,當然還包括一些設定,比如哪些動態庫是需要簽名的(雖然可以自制動態庫,但是需要進行簽名)。

三、 package.json 目錄

{
    "name": "WSLUniPlugin",//外掛名稱
    "id": "WSLUniPlugin",//外掛ID
    "version": "1.0",
    "description": "功能描述",//功能描述這裡進行功能描述,新增後會在HBuilder下展示
    "_dp_type":"nativeplugin",//原生元件型別
    "_dp_nativeplugin":{
        "ios": {
            "plugins": [
                {
                    "type": "component",//外掛型別,是功能元件(module)還是檢視元件(component)
                    "name": "wsl-component",//在nvue檔案內的標籤tag
                    "class": "WSLComponent" //iOS 原生物件class,繼承自 DCUniComponent
                },
            ],
            "integrateType": "framework",//自制庫型別
            "hooksClass": "",這裡宣告 app 生命週期勾子物件,它會同時響應appDelegate 事件
            "frameworks": [
				"libAFNetworking.a",//uni遠端非儲備庫,需要標註宣告
				"Masonry.framework",//Masonry 為uni遠端儲備庫,ios 資料夾裡不需要再新增,否則編譯出現符號重複錯誤
            ],
            "embedFrameworks": [
                "IDLFaceSDK.framework",//動態庫
            ],
            "capabilities": {
                "entitlements": {
                },
                "plists": {
                }
            },
            "plists": {
            },
            "assets": [
                 "WSLUniPlugin.xcassets"//圖片資原始檔,這裡填寫的是與 ios 資料夾的相對路徑,因為 WSLUniPlugin.xcassets 就在 ios 檔案裡,所以直接寫。
            ],
            "privacies": [
            ],
            "embedSwift": false,
            "deploymentTarget": "8.0",//支援iOS版本
            "validArchitectures": [
                 "arm64"//架構
            ],
            "parameters": {
            },
            "resources": [
                "WSLUniPlugin.bundle",//這裡是一些資原始檔,比如 bundle,這裡填寫的是與 ios 資料夾的相對路徑,因為 WSLUniPlugin.bundle 就在 ios 檔案裡,所以直接寫。
            ]
        }
    }
}

上面就是基本的設定設定。因為uni每天的雲編譯次數有限(10次左右),而且包體積要小於40M,超過次數2元每次,超過體積 10元每100M。是不是有點小坑,這樣,每天的試錯成本極高,所以,在這裡記錄一下。

推薦:《》

以上就是聊聊iOS端下uniAPP原生外掛是怎樣打包的?(打包流程分享)的詳細內容,更多請關注TW511.COM其它相關文章!