Uni-app 开发原生插件(UTS)

4,018 阅读8分钟

使用 Uni-app 开发原生插件(UTS)


2. UTS 简介

UTS(Uniapp Ternary System) 是 DCloud 开发的一套用于跨平台应用开发的技术架构。UTS 允许开发者使用一套代码同时适配多个平台,包括 iOS、Android 和 Web。UTS 的设计理念是简化跨平台开发的流程,使得开发者能够更高效地构建和维护应用。

2.1 UTS 的核心特性

  • 跨平台支持:开发者只需编写一次代码,即可在多个平台上运行,大大降低了开发成本。
  • 高性能:UTS 通过底层优化,提高了应用的运行效率,确保在各个平台上都能流畅运行。
  • 易于扩展:UTS 提供了一套完整的插件机制,开发者可以方便地开发原生插件以调用平台特有的 API。

2.2 UTS 与 Uni-app 的关系

Uni-app 是基于 UTS 的框架,因此 Uni-app 开发的应用能够充分利用 UTS 的特性。通过 Uni-app,开发者可以轻松地使用 Vue.js 进行开发,同时享受到 UTS 提供的高效跨平台支持。这意味着,当我们在 Uni-app 中开发原生插件时,我们其实是在 UTS 的框架下进行操作,这样可以更好地集成原生功能,提升应用的用户体验。


3. 插件的目录结构

我们将创建一个新的 Uni-app 项目,并在其中建立插件的目录结构。假设我们项目的名称为 my-wechat-card-plugin,结构如下:

my-wechat-card-plugin/
├── package.json
├── src/
│   ├── ios/
│   │   └── WeChatCardPlugin.m
│   ├── android/
│   │   └── WeChatCardPlugin.java
│   └── README.md
└── unplugin.config.js

4. 创建和配置插件

4.1 创建新的 Uni-app 项目

如果你还没有创建 Uni-app 项目,可以使用以下命令创建一个新的项目:

vue create -p dcloudio/uni-preset-vue my-wechat-card-plugin
cd my-wechat-card-plugin

4.2 创建插件的基本文件

在项目根目录下,创建 src 文件夹,并在其中创建 iosandroid 文件夹。然后分别在 iosandroid 文件夹中创建 WeChatCardPlugin.mWeChatCardPlugin.java 文件,以及 README.md 文件以供文档说明。

4.3 更新 package.json

package.json 中添加插件信息,示例配置如下:

{
  "name": "my-wechat-card-plugin",
  "version": "1.0.0",
  "description": "A Uni-app plugin to open WeChat card",
  "main": "index.js",
  "scripts": {
    "build": "uni build"
  },
  "dependencies": {}
}

5. 开发 iOS 原生插件

5.1 创建 iOS 原生插件

src/ios/WeChatCardPlugin.m 文件中,编写以下代码:

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <UniPlugin/UniPlugin.h>

@interface WeChatCardPlugin : NSObject <UPlugInterface>
@end

@implementation WeChatCardPlugin

- (void)openWeChatCard:(NSDictionary *)params completion:(void (^)(NSDictionary *))completion {
    // 获取传入的参数
    NSString *cardId = params[@"cardId"];
    
    // 拼接 URL
    NSString *urlString = [NSString stringWithFormat:@"weixin://dl/card?cardId=%@", cardId];
    NSURL *url = [NSURL URLWithString:urlString];

    // 检查 URL 是否可以打开
    if ([[UIApplication sharedApplication] canOpenURL:url]) {
        [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:^(BOOL success) {
            // 返回成功信息
            if (completion) {
                completion(@{@"status": @"success", @"message": @"WeChat Card opened successfully."});
            }
        }];
    } else {
        // 返回失败信息
        if (completion) {
            completion(@{@"status": @"error", @"message": @"WeChat is not installed."});
        }
    }
}

@end

在这里,我们创建了一个 WeChatCardPlugin 类,并实现了一个 openWeChatCard 方法。该方法通过 URL 拉起微信卡包,参数为传入的卡片 ID。

5.2 更新配置文件

在项目根目录下创建 unplugin.config.js 文件,并添加以下内容:

module.exports = {
    // 插件名称
    pluginName: 'WeChatCardPlugin',
    // iOS 配置
    ios: {
        className: 'WeChatCardPlugin',
        method: 'openWeChatCard',
    },
    // Android 配置
    android: {
        className: 'WeChatCardPlugin',
        method: 'openWeChatCard',
    },
};

6. 开发 Android 原生插件

6.1 创建 Android 原生插件

src/android/WeChatCardPlugin.java 文件中,编写以下代码:

package com.example.wechatcardplugin;

import android.content.Intent;
import android.net.Uri;

import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;

public class WeChatCardPlugin extends ReactContextBaseJavaModule {

    public WeChatCardPlugin(ReactApplicationContext reactContext) {
        super(reactContext);
    }

    @Override
    public String getName() {
        return "WeChatCardPlugin";
    }

    @ReactMethod
    public void openWeChatCard(String cardId, Promise promise) {
        // 拼接 URL
        String urlString = "weixin://dl/card?cardId=" + cardId;
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(urlString));

        // 检查是否有应用可以处理这个 Intent
        if (intent.resolveActivity(getReactApplicationContext().getPackageManager()) != null) {
            getReactApplicationContext().startActivity(intent);
            promise.resolve("WeChat Card opened successfully.");
        } else {
            promise.reject("ERROR", "WeChat is not installed.");
        }
    }
}

与 iOS 版本类似,这里我们创建了 WeChatCardPlugin 类,并实现了 openWeChatCard 方法,主要逻辑是通过 Intent 拉起微信卡包。

6.2 更新配置文件

unplugin.config.js 中确认 Android 配置与 iOS 配置一致,已在前面进行过。


7. 在 Uni-app 中调用原生插件

7.1 安装插件

完成插件开发后,将编译后的插件文件放入 Uni-app 项目的相应目录,确保在项目中可以引用到。

7.2 调用插件方法

在 Uni-app 的页面中调用原生插件的方法:

<template>
    <view>
        <input v-model="cardId" placeholder="请输入卡片 ID" />
        <button @click="openCard">打开微信卡包</button>
    </view>
</template>

<script>
export default {
    data() {
        return {
            cardId: ''
        };
    },
    methods: {
        openCard() {
            const { cardId } = this;
            uni.callNativePlugin({
                plugin: "WeChatCardPlugin",
                method: "openWeChatCard",
                params: { cardId },
                success: (response) => {
                    console.log(response);
                    uni.showToast({ title: response.message, icon: 'success' });
                },
                fail: (error) => {
                    console.error(error);
                    uni.showToast({ title: error.message, icon: 'none' });
                }
            });
        }
    }
};
</script>

8. 调试原生插件

在开发原生插件时,调试是至关重要的。以下是一些调试原生插件的建议:

  • iOS 调试:使用 Xcode 进行调试。打开 Xcode,导入您的 Uni-app 项目,设置断点并运行。
  • Android 调试:使用 Android Studio 进行调试。您可以在代码中设置断点,并查看 Logcat 以监控日志输出。

确保在调试过程中检查原生插件的功能是否按预期工作。

9. 发布到 Uni-app 插件市场

  1. 访问 Uni-app 插件市场:首先,前往 DCloud 插件市场,您需要注册一个账号并登录。

  2. 提交插件

    • 在插件市场页面上,找到“发布插件”的选项。

    • 填写插件的基本信息,例如插件名称、描述、版本号等。

    • 上传您开发的插件文件,包括代码、文档以及示例项目(如果有)。

  3. 审核:提交后,DCloud 会对您的插件进行审核。审核通过后,您的插件将上线,其他开发者就可以在市场中搜索到并使用您的插件。

  4. 维护与更新:在发布后,您可以根据用户反馈对插件进行维护和更新。每次更新都需要重新发布并进行审核。

10. 插件的维护与更新

维护和更新是保证插件长期有效的重要部分。以下是一些最佳实践:

10.1 监听用户反馈

用户的反馈是插件改进的宝贵资源。您可以:

  • 在插件市场的评论区中积极回答用户的问题。
  • 定期收集用户反馈,了解用户在使用过程中遇到的挑战。
  • 根据用户的建议和需求,考虑新功能的添加或现有功能的优化。

10.2 定期检查兼容性

随着平台和技术的更新,保持插件与最新版本的 Uni-app 及其生态的兼容性是必要的。确保:

  • 定期检查 Uni-app 和 UTS 的更新日志。
  • 在新版本发布后,及时测试您的插件,确保其功能在新环境中正常运行。

10.3 版本管理

使用版本控制工具(如 Git)来管理插件的版本,可以更好地追踪和记录代码的变化。在发布新版本时,遵循以下原则:

  • 遵循语义化版本控制:如 MAJOR.MINOR.PATCH 的格式,其中:

    • MAJOR:大版本,包含不兼容的 API 更改。
    • MINOR:小版本,添加功能且向后兼容。
    • PATCH:补丁版本,修复错误且向后兼容。

11. 扩展功能与最佳实践

在完成基本的微信卡包插件后,您还可以考虑一些扩展功能,以提升用户体验和插件的实用性。

11.1 支持多种卡片类型

您可以让插件支持多种卡片类型(如优惠券、会员卡等),通过在参数中增加卡片类型字段,修改 URL 的构建逻辑,以适应不同类型的卡片。

NSString *urlString = [NSString stringWithFormat:@"weixin://dl/card?cardId=%@&type=%@", cardId, cardType];

在 Android 实现中类似:

String urlString = "weixin://dl/card?cardId=" + cardId + "&type=" + cardType;

11.2 异常处理与用户反馈

在插件调用过程中,添加更多的错误处理和用户反馈。例如,提示用户输入的卡片 ID 格式是否正确,或者在未安装微信的情况下,提供下载安装的链接。

// 检查卡片 ID 格式
if (![self isValidCardId:cardId]) {
    if (completion) {
        completion(@{@"status": @"error", @"message": @"Invalid card ID format."});
    }
    return;
}
if (!isValidCardId(cardId)) {
    promise.reject("ERROR", "Invalid card ID format.");
    return;
}

11.3 提供完整的示例代码

在插件的 README.md 文件中,提供完整的示例代码,方便其他开发者快速上手。示例代码应包括如何安装插件、如何在 Uni-app 中调用插件方法,以及示例输入输出。

## 使用说明

### 安装插件

使用 npm 安装插件:

```bash
npm install my-wechat-card-plugin

调用插件方法

uni.callNativePlugin({
    plugin: "WeChatCardPlugin",
    method: "openWeChatCard",
    params: { cardId: "123456" },
    success: (response) => {
        console.log(response);
    },
    fail: (error) => {
        console.error(error);
    }
});

12. 进一步学习资源

为了更深入地了解 Uni-app 和原生插件开发,您可以参考以下资源:

13. 总结

本文详细介绍了如何在 Uni-app 中开发原生插件,使用它来拉起微信卡包。我们探讨了插件的创建、实现、调用、调试和发布等各个方面,确保您能够从中获得实用的知识与技能。同时,通过提供 UTS 的介绍,您可以在今后的开发中提升跨平台应用的效率。

希望这些内容能为您带来帮助,并激励您在 Uni-app 开发的道路上不断探索与创新。如有任何问题或建议,欢迎随时在评论区讨论!感谢您的阅读,期待您在开发中取得优异的成绩!