预备环境

  • iOS 开发环境。
  • 下载离线打包iOS版SDK(5+ SDK下载)。
  • 从插件市场下载原生插件(付费插件不支持下载) 插件市场

预备知识

1.插件目录说明

  1. |-- 插件目录结构
  2. |-- android // android 插件
  3. |-- ios // ios 插件
  4. |-- package.json // 插件配置文件

原生插件目录结构都是固定的,其中 android 路径中放的是 android 端插件,ios 路径中放的是 ios 端插件,package.json 为插件的配置文件,配置了插件id、格式、插件资源以及插件所需权限等等,离线集成需要开发者根据 package.json 手动配置离线工程(通过 HBuilderX 云端打包插件打包机会自动完成配置)。

下面我们学习一下 package.json 配置的每个节点的含义以及如何手动将插件集成到离线工程中并添加相关配置项;

2.完整 package.json 配置文件说明

完整的 package.json 配置文件格式如下(已移除离线集成插件不需要关心的节点),下面对每个节点如何在离线工程中配置进行说明

注意:一些插件中可能不会包含所有的节点,只需按照下面的说明配置插件中包含的节点即可

  1. {
  2. "name": "插件名称",
  3. "id": "插件标识",
  4. "version": "插件版本号",
  5. "description": "插件描述信息",
  6. "_dp_type":"nativeplugin",
  7. "_dp_nativeplugin":{
  8. "ios": {
  9. "plugins": [
  10. {
  11. "type": "module|component, 插件类型",
  12. "name": "插件名称",
  13. "class": "插件的类名"
  14. }
  15. ],
  16. "hooksClass": "插件事件钩子注册类名",
  17. "frameworks": [
  18. "插件依赖的系统库(系统库有.framework和.tbd和.dylib类型)"
  19. ],
  20. "embedFrameworks": [
  21. "依赖的framework动态库"
  22. ],
  23. "resources": [
  24. "插件要使用的资源文件列表,相对于ios目录的路径"
  25. ],
  26. "privacies": [
  27. "插件使用到的隐私列表,如NSPhotoLibraryUsageDescription"
  28. ],
  29. "parameters": {
  30. "插件需要配置的参数名称, 如appid": {
  31. "des": "参数描述信息",
  32. "key": "参数需要配置到infor.plist中的键名, 嵌套时使用:分割,如getui:appid"
  33. }
  34. }
  35. }
  36. }
  37. }

plugins hooksClass

插件信息,及插件事件钩子注册类名,找到离线工程的 info.plist 文件右键选择 Open As -> Source Code 源码查看,添加如下节点信息,并根据 package.json 中配置的信息修改对应项的值 hooksClass、type、name、class

注:工程中只能包含一个dcloud_uniplugins节点,如果配置多个插件只需在dcloud_uniplugins节点下配置多个dict节点即可

  1. <key>dcloud_uniplugins</key>
  2. <array>
  3. <dict>
  4. <key>hooksClass</key>
  5. <string>插件事件钩子注册类名</string>
  6. <key>plugins</key>
  7. <array>
  8. <dict>
  9. <key>type</key>
  10. <string>插件类型</string>
  11. <key>name</key>
  12. <string>插件名称</string>
  13. <key>class</key>
  14. <string>插件的类名</string>
  15. </dict>
  16. </array>
  17. </dict>
  18. </array>

frameworks

frameworks 为插件依赖的系统 framework 库,在工程的 Link Binary With Libraries 中点击下面的 + 号将插件所需的系统库添加进来即可

iOS 离线打包使用插件 - 图1 iOS 离线打包使用插件 - 图2

embedFrameworks

embedFrameworks 为插件依赖的动态 framework 库,需要以动态库的方式引入工程一定不要弄错,在工程的 Embed Frameworks 中点击下面的 + 号,在插件ios目录中将 embedFrameworks 中所配置的动态库添加进来

iOS 离线打包使用插件 - 图3

在弹窗中选择 Add Other 然后找到插件ios目录下面的动态 framework 库

iOS 离线打包使用插件 - 图4

其他 .a 静态库及 frameworks 静态库

除了 frameworks 节点及 embedFrameworks 节点中所配置的依赖库,在ios目录下面的其他 .a库文件 或 .framework库文件都为静态库,同样需要引入到工程中,同样在工程的 Link Binary With Libraries 中点击下面的 + 号将这些库也添加到工程

resources

resources 节点配置的是插件所需的资源文件,在工程的 Copy Bundle Resources 中点击下面的 + 号将插件所有资源文件添加到工程中

iOS 离线打包使用插件 - 图5 iOS 离线打包使用插件 - 图6

headers

headers 为插件所暴露的头文件,只需将这些文件直接拖入到工程中即可

privacies

privacies 为插件所需要到的系统权限,需要在 info.plist 中添加相应权限描述 如

iOS 离线打包使用插件 - 图7

parameters

parameters 中配置的信息也需要在 info.plist 中添加 举例:

“key”: “getui:appid”

info.plist 中添加

  1. <key>getui</key>
  2. <dict>
  3. <key>appid</key>
  4. <string>填写对应的appid</string>
  5. </dict>

集成示例

1.下载插件

从插件市场下载uni-app原生插件(以RichAlert为例)

2.将下载的插件解压,将插件拷贝到离线工程根目录中

iOS 离线打包使用插件 - 图8

3.查看 package.json 文件并配置工程

这个插件配置信息比较简单只有 plugins 节点

  1. {
  2. "name": "RichAlert",
  3. "id": "DCloud-RichAlert",
  4. "version": "0.1.3",
  5. "description": "示例插件",
  6. "_dp_type":"nativeplugin",
  7. "_dp_nativeplugin":{
  8. "ios": {
  9. "plugins": [
  10. {
  11. "type": "module",
  12. "name": "DCloud-RichAlert",
  13. "class": "DCRichAlertModule"
  14. }
  15. ],
  16. "integrateType": "library",
  17. "deploymentTarget": "8.0"
  18. }
  19. }
  20. }

在 info.plist 中添加 plugins 信息

  1. <key>dcloud_uniplugins</key>
  2. <array>
  3. <dict>
  4. <key>hooksClass</key>
  5. <string></string>
  6. <key>plugins</key>
  7. <array>
  8. <dict>
  9. <key>type</key>
  10. <string>module</string>
  11. <key>name</key>
  12. <string>DCloud-RichAlert</string>
  13. <key>class</key>
  14. <string>DCRichAlertModule</string>
  15. </dict>
  16. </array>
  17. </dict>
  18. </array>

将ios目录下的.a库添加到工程中 [attach]32864[/attach]

至此本插件集成配置已完成

4.运行

示例工程 GitHub 地址: https://github.com/dcloudio/UniPluginPackage


发现错误?想参与编辑?在 GitHub 上编辑此页面!