使用 CocoaPods 开发 iOS 插件

CocoaPods 是 iOS 项目的依赖管理工具,开发者在开发 iOS 插件的过程中需要引入第三方 SDK 时,可以选择使用 CocoaPods 来管理项目依赖。本文将以 iOS 插件引入微信 Open SDK 并实现拉起小程序为例,指导开发者搭建插件项目。

  1. 多端框架现已支持集成微信 Open SDKopen in new window 并有对应的 JSAPIopen in new window 支持跳转小程序。本文仅以示例为目的在多端插件中实现微信 Open SDK 的引入、实现插件方法完成小程序跳转
  2. Open SDK 接入流程详解可具体查看官方文档open in new window

一、开发环境准备

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

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

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

二、初始化 CocoaPods

  1. 在上述 1)创建的多端插件工程项目中,在 ios 目录下新建一个 Podfile 文件。文件内容如下:
# YOUR_PLUGIN_ID 替换成你的插件 id
target 'YOUR_PLUGIN_ID' do
  pod "MyPlugin", :path => "."
end
  1. ios 目录下新建一个 MyPlugin.podspec 文件,并指定引入微信 Open SDK。文件内容如下:

# 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}" }

  # Set your deployment target
  spec.ios.deployment_target = '11.0'
  
  # 引入 Open SDK
  spec.dependency 'WechatOpenSDK-XCFramework'

end

  1. ios 目录下执行 pod install。命令执行完成以后,你的项目将会是以下的结构,新增了 PodsNativePlugin.xcworkspacePodfile.lock
  1. 双击 NativePlugin.xcworkspace,打开 Xcode,即可看见创建好的项目工程。
  1. 如开发者在上述 3 中看见提示,可按下图添加 $(inherited)Other Linker Flags 的 Debug 与 Release 配置中。

然后重新执行 pod install,可看见对应提示消失。

三、实现跳转小程序

分别在 MyPlugin.hMyPlugin.mm 添加代码,引入并初始化 Open SDK,实现插件同步方法完成跳转小程序。

// MyPlugin.h

#import <Foundation/Foundation.h>
#import <WXApi.h>

NS_ASSUME_NONNULL_BEGIN

@interface MyPlugin: WeAppNativePlugin<WXApiDelegate>

@end

NS_ASSUME_NONNULL_END

// MyPlugin.mm
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <WXApi.h>
#import "WeAppNativePlugin.framework/WeAppNativePlugin.h"
#import "MyPlugin.h"

__attribute__((constructor))
static void initPlugin() {
    [MyPlugin registerPluginAndInit:[[MyPlugin alloc] init]];
};

@implementation MyPlugin

// 声明插件ID
WEAPP_DEFINE_PLUGIN_ID(YOUR_PLUGIN_ID)

// 声明插件同步方法
WEAPP_EXPORT_PLUGIN_METHOD_SYNC(mySyncFunc, @selector(mySyncFunc:))

- (id)mySyncFunc:(NSDictionary *)param {    

   WXLaunchMiniProgramReq *launchMiniProgramReq = [WXLaunchMiniProgramReq object];
   launchMiniProgramReq.userName = @"YOUR_USERNAME";  // 拉起的小程序的username
   launchMiniProgramReq.miniProgramType = WXMiniProgramTypeTest; // 拉起小程序的类型
   [WXApi sendReq:launchMiniProgramReq completion:nil];        
    
   return @"invoke launch miniprogram";
}

- (void)onReq:(BaseReq*)reqonReq {
    
}

- (void)onResp:(BaseResp*)resp {
    NSLog(@"wxapi onresp %@", resp);
}

// 插件初始化方法,在注册插件后会被自动调用
- (void)initPlugin {
    NSLog(@"initPlugin");
    // 初始化 Open SDK
    [WXApi registerApp:@"YOUR_OPEN_APPID" universalLink:@"YOUR_UNIVERSAL_LINK"];
    [self registerAppDelegateMethod:@selector(application:openURL:options:)];
    [self registerAppDelegateMethod:@selector(application:continueUserActivity:restorationHandler:)];
}

- (void)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
    // 按 Open SDK 要求重写方法
    [WXApi handleOpenURL:url delegate:self];
}

- (void)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> *__nullable restorableObjects))restorationHandler {
    // 按 Open SDK 要求重写方法
    [WXApi handleOpenUniversalLink:userActivity delegate:self];
}

@end

四、运行

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

五、构建

开发者可以在 ios 目录下,执行以下命令打包出插件动态库

xcodebuild -workspace NativePlugin.xcworkspace -scheme plugin -configuration Release -arch arm64 -sdk iphoneos -derivedDataPath mypluginbuild

命令执行成功之后,可以在 ios/mypluginbuild 目录下找到 YOUR_PLUGIN_ID.framework

最后,开发者可将构建产物放至对应目录open in new window下;上传插件,最终应用到多端应用中,具体可查看指引open in new window

六、总结

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