uniapp原生插件開發(iOS)

開發環境

  • iOS開發環境,Xcode 12.1 及以上版本
  • 下載開發插件需要的 SDK包 并解壓
  • 安裝 uni-app 開發工具 HBuilderX

1、創建插件工程

打開 Xcode,創建一個新的Framework工程,然后點擊 Next


image.png

輸入插件工程名稱(建議使用一個性化的前綴,避免與其他人的插件包名沖突),其他項不需要修改保持工程默認填充的即可,然后點擊Next


image.png

然后選擇工程存放路徑,直接存放在 iOSSDK目錄中的 HBuilder-uniPluginDemo 插件開發主工程目錄下,然后點擊 Create
image.png

然后選中工程名,在TARGETS->Build Settings中,將 Mach-O Type 設置為 Static Library 如下圖所示


image.png

2、導入插件工程

打開 iOSSDK/HBuilder-uniPluginDemo工程目錄,雙擊目錄中的HBuilder-uniPlugin.xcodeproj 文件運行插件開發主工程
在 Xcode 項目左側目錄選中主工程名,然后點擊右鍵選擇Add Files to “HBuilder-uniPlugin” ...


image.png

然后選擇您剛剛創建的插件工程路徑中,選中插件工程文件,勾選 Create folder references 和 Add to targets 兩項,然后點擊Add


image.png

3、工程配置

然后在 Xcode 項目左側目錄選中主工程名,在TARGETS->Build Phases->Dependencies中點擊+


image.png

在彈窗中選中插件工程,如圖所示,然后點擊Add,將插件工程添加到Dependencies中


image.png

然后在Link Binary With Libraries中點擊+,同樣在彈窗中選中插件工程,點擊Add
image.png

此時可以看到 Dependencies 和 Link Binary With Libraries 都添加了插件工程,如下圖所示


image.png

接下來需要在插件工程的Header Search Paths中添加開發插件所需的頭文件引用,頭文件存放在主工程的HBuilder-Hello/inc中,添加方法如下圖所示,在 Xcode 項目左側目錄選中插件工程名,找到TARGETS->Build Settings->Header Search Paths雙擊右側區域打開添加窗口,然后將inc目錄拖入會自動填充相對路徑,然后將模式改成recursive

4、代碼實現

插件擴展方式

擴展原生功能有兩種方式:
module:不需要參與頁面布局,只需要通過 API 調用原生功能,比如:獲取當前定位信息、數據請求等功能,通過擴展module的方式來實現;
component:需要參與頁面布局,比如:map、image等需要顯示UI的功能,通過擴展component即組件的方法來實現;

擴展 module

新建TestModule類,繼承 DCUniModule,引入 DCUniModule.h 頭文件。
然后在 TestModule.m 文件中添加實現方法


/// 異步方法(注:異步方法會在主線程(UI線程)執行)
/// @param options js 端調用方法時傳遞的參數   支持:String、Number、Boolean、JsonObject 類型
/// @param callback 回調方法,回傳參數給 js 端   支持: NSString、NSDictionary(只能包含基本數據類型)、NSNumber 類型
- (void)testAsyncFunc:(NSDictionary *)options callback:(UniModuleKeepAliveCallback)callback {
 
    // options 為 js 端調用此方法時傳遞的參數 NSLog(@"%@",options); // 可以在該方法中實現原生能力,然后通過 callback 回調到 js
 
   if (callback) {
       // 第一個參數為回傳給js端的數據,第二個參數為標識,表示該回調方法是否支持多次調用,如果原生端需要多次回調js端則第二個參數傳 YES;
        callback(@"success",NO);
 
    }
}
//通過宏 UNI_EXPORT_METHOD 將異步方法暴露給 js 端,只有通過UNI_EXPORT_METHOD暴露的原生方法才能被 js 端識別到
UNI_EXPORT_METHOD_SYNC(@selector(testSyncFunc:))
5、配置插件信息

選中工程中的HBuilder-uniPlugin-Info.plist文件右鍵->Open As->Source Code找到dcloud_uniplugins節點,copy下面的內容添加到dcloud_uniplugins節點下,按插件的實際信息填寫對應的項

<dict>
    <key>hooksClass</key>
    <string>填寫 hooksClass 類名 </string>
    <key>plugins</key>
    <array>
        <dict>
            <key>class</key>
            <string>填寫 module 或 component 的類名</string>
            <key>name</key>
            <string>填寫暴露給js端對應的 module 或 component 名稱</string>
            <key>type</key>
            <string>填寫 module 或 component</string>
        </dict>
    </array>
</dict>

在 uni-app 項目中調用 module 方法

<template>
    <div>
        <button type="primary" @click="testAsyncFunc">testAsyncFunc</button>
        <button type="primary" @click="testSyncFunc">testSyncFunc</button>
    </div>
</template>
 
<script>
    // 首先需要通過 uni.requireNativePlugin("ModuleName") 獲取 module
    var testModule = uni.requireNativePlugin("DCTestUniPlugin-TestModule")
    export default {
        methods: {
            testAsyncFunc() {
                // 調用異步方法
                testModule.testAsyncFunc({
                        'name': 'uni-app',
                        'age': 1
                    },
                    (ret) => {
                        uni.showToast({
                            title:'調用異步方法 ' + ret,
                            icon: "none"
                        })
                    })
            },
            testSyncFunc() {
                // 調用同步方法
                var ret = testModule.testSyncFunc({
                    'name': 'uni-app',
                    'age': 1
                })
 
                uni.showToast({
                    title:'調用同步方法 ' + ret,
                    icon: "none"
                })
            }
        }
    }
</script>
6、導入 uni-app 資源

生成 uni-app 本地打包資源
首先需要生成本地打包資源,在 HBuilderX 中選您的 uni-app 工程,右鍵->發現->原生App-本地打→生成本地打包App資源


image.png

項目編譯完成后會在 HBuilderX 控制臺輸出資源存路徑,點擊路徑會自動打開資源所在文件夾


image.png

導入 uni-app 資源

接下來,將應用資源導入到插件開發主工程的HBuilder-Hello/Pandora/apps/中,如下圖所示,直接拖進去即可

image.png

然后打開工程的 control.xml 文件,將 appid 改成 uni-app項目的 id,如下圖所示
image.png

然后運行項目測試,如下圖所示(能調到 module 的方法,并且可以獲取 module 返回的數據,則說明功能正常)
image.png

7、 生成插件包

編譯生成插件庫文件(.framework 或 .a)

如下圖所示,將編譯工程選擇為插件項目(DCTestUniPlugin),運行設備選擇Generic iOS Device

image.png

然后點擊Edit Scheme...在彈窗中,將Run->Info->Build Configuration切換到Release,然后點擊Close關閉彈窗
然后在 Xcode 左側目錄中選中插件工程名,查看TARGETS->Build Settings->Architectures,確保

  • Build Active Architecture Only->ReleaseNo
  • Valid Architectures 中至少包含 arm64armv7(一般保持工程默認配置即可)
    image.png

    然后點擊運行按鈕Command + B 編譯運行工程
    編譯完成后,在插件工程 Products 下生成的庫(DCTestUniPlugin.framework)即為插件所需要的依賴庫文件,右鍵->Show in Finder,可打開庫所在文件夾
    image.png

8、 編寫 package.json 配置文件

package.json 為插件的配置文件,配置了插件id、格式、插件資源以及插件所需權限等等信息

新建一個 package.json 文件,根據插件實際情況填寫插件配置信息

{
    "name": "TestUniPlugin",
    "id": "DCTestUniPlugin",
    "version": "1.0.0",
    "description": "uni示例插件",
    "_dp_type": "nativeplugin",
    "_dp_nativeplugin": {
        "ios": {
            "plugins": [{
                "type": "module",
                "name": "DCTestUniPlugin-TestModule",
                "class": "TestModule"
            }, {
                "type": "component",
                "name": "dc-testmap",
                "class": "TestComponent"
            }],
            "frameworks": ["MapKit.framework"],
            "integrateType": "framework",
            "deploymentTarget": "9.0"
        }
    }
}

然后以插件id為名新建一個文件夾,將編輯好的 package.json 放進去,然后在文件夾中在新建一個 ios (小寫)文件夾,將剛剛生成的依賴庫(DCTestUniPlugin.framework)copy 到 ios 根目錄,這樣我們的插件包就構建完成了,如下圖所示


image.png

9、使用插件

HBuilderX 的 uni-app 項目創建中“nativeplugins”目錄(如不存在則創建)將插件配置到uni-app項目下的“nativeplugins”目錄


image.png

uni-app原生插件本地配置
將原生插件配置到uni-app項目的“nativeplugins”下,還需要在manifest.json文件的“App原生插件配置”項下點擊“選擇本地插件”,在列表中選擇需要打包生效的插件:


image.png

保存后,重新提交云端打包生效。原生插件調試僅支持自定義基座調試
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,967評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,273評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,870評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,742評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,527評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,010評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,108評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,250評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,769評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,656評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,853評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,371評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,103評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,472評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,717評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,487評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,815評論 2 372

推薦閱讀更多精彩內容