# iOS 插件依赖动态库

多端框架下的 iOS 插件最终将打包成一个动态库供多端 App 使用。在使用 CocoaPods 开发 iOS 插件中介绍了如何引入静态库,本文将同样使用 CocoaPods 介绍插件动态库如何引入第三方动态库依赖。

本文将以依赖 AFNetworking 网络库,实现一个发送 HTTP 请求的功能为例进行示例。

# 一、开发环境准备

  1. 根据原生插件工具操作指引生成一个多端插件工程项目

  2. 安装 Xcode,准备好 iOS 开发环境

  3. 安装 CocoaPods,具体可参看官网指引

# 二、初始化 CocoaPods

  1. 在上述 1)创建的多端插件工程项目中,在 ios 目录下新建一个 Podfile 文件。文件内容如下:
platform :ios, '11.0'
use_frameworks!

# YOUR_PLUGIN_ID 替换成你的插件 id
target 'YOUR_PLUGIN_ID' do
    pod "MyPlugin", :path => "."
end

# 必须 为了调试的时候把依赖的动态库也打入 Frameworks 中
target 'demo' do
    pod 'AFNetworking', '~> 4.0'
end

  1. ios 目录下新建一个 MyPlugin.podspec 文件,并指定引入 AFNetworking。文件内容如下:

# MyPlugin.podspec

Pod::Spec.new do |spec|
    spec.name         = 'MyPlugin'
    spec.version      = '1.0.0'
    spec.summary      = 'Summary of MyPlugin'
    spec.homepage     = 'https://your-framework-website.com'
    spec.author       = { 'Your Name' => 'your@email.com' }
    spec.source       = { :git => 'https://github.com/your/repo.git', :tag => "#{spec.version}" }
    spec.ios.deployment_target = '11.0'

    # 引入 AFNetworking
    spec.dependency 'AFNetworking', '~> 4.0'
end
  
  1. ios 目录下执行 pod install。命令执行完成以后,你的项目将会是以下的结构,新增了 PodsNativePlugin.xcworkspacePodfile.lock
  1. 双击 NativePlugin.xcworkspace,打开 Xcode,即可看见创建好的项目工程
  1. YOUR_PLUGIN_ID 的 target 下,配置链接依赖的动态库

# 实现发送 HTTP 请求

MyPlugin.mm 中添加如下代码,实现插件的异步方法完成 HTTP 请求。

# 四、运行

开发者在开发调试阶段,运行插件工程的方法与 iOS 原生插件开发指引中的指引无异。需要注意的是,使用 CocoaPods 管理项目,需要通过双击 NativePlugin.xcworkspace 打开 Xcode。简单区分就是 Xcode 文件列表中是否有 Pods 的相关内容。

真机运行返回

# 五、构建

注:开发者工具构建 iOS 产物功能目前并不支持直接打包出所需产物,开发者需自行完成打包。

开发者需要构建出 PLUGIN_ID.framework 以及依赖的动态库 framework,并把构建产物放至对应目录下;上传插件,最终应用到多端应用中,具体可查看指引

以本为例,需要构建出如下图所示的 PLUGIN_ID.framework 与 AFNetworking.framework。

# 自行构建流程示例

  1. 新建一个 PackageFrameworks target
  1. 添加 PLUGIN_ID.framework 为 target dependencies

  1. 新建脚本,将构建产物拷贝至多端项目的插件产物目录

如果你的插件包含静态库,这里不应该拷贝静态库。因为静态库已经打包在了 PLUGIN_ID.framework 内。

OUTPUT_DIR="${SRCROOT}/../build/ios"

# 创建输出目录
mkdir -p "${OUTPUT_DIR}"

echo "OUTPUT_DIR" $OUTPUT_DIR
echo "BUILT_PRODUCTS_DIR" $BUILT_PRODUCTS_DIR
cp -R "${BUILT_PRODUCTS_DIR}/PLUGIN_ID.framework" "${OUTPUT_DIR}"

# 复制依赖的动态库
cp -R "${BUILT_PRODUCTS_DIR}/AFNetworking/AFNetworking.framework" "${OUTPUT_DIR}"

  1. 点击运行,构建成功后插件将更新至多端项目的插件产物目录

# 六、总结

在上文中,我们介绍了如何使用 CocoaPods 来引入动态库依赖。开发者可在该项目结构的基础上,主要通过修改 MyPlugin.podspec 文件来引入更多的第三方 SDK,添加更多的自定义配置来完成自身需求。