iOS 插件依赖动态库

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

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

一、开发环境准备

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

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

  3. 安装 CocoaPods,具体可参看官网指引open in new window

二、初始化 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 原生插件开发指引open in new window中的指引无异。需要注意的是,使用 CocoaPods 管理项目,需要通过双击 NativePlugin.xcworkspace 打开 Xcode。简单区分就是 Xcode 文件列表中是否有 Pods 的相关内容。

真机运行返回

五、构建

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

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

以本为例,需要构建出如下图所示的 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,添加更多的自定义配置来完成自身需求。