在 HarmonyOS 应用里接入文档能力,目标通常很明确:依赖装上、注册成功、真机能打开一份 Word。WPS Open SDK 以 HAR 交付,对外入口是单例 WPSApi,打开统一走 OpenFileRequest。本文按「依赖 → 注册 → 沙箱打开 → 排错 → 封装」写一版快速接入说明,帮你把官方快速接入示例落到工程里;字段语义以官方对接文档为准。

一、快速接入链路在工程里对应什么

对接文档把基础链路概括为:申请凭据与 HAR → 集成依赖 → registerApp →(按凭据约定)可选 setWpsFileToken → 构造 OpenFileRequestsendRequest。工程落地时建议把状态拆开,而不是堆在一个按钮回调里。

阶段 关键动作 就绪标志
依赖 libs/wps_sdk.har + ohpm install 能 import @wps/wps_sdk
注册 WPSApi.registerApp 回调 ResultCode.OK
授权补充 可选 setWpsFileToken 按当前 HAR / 凭据约定
打开 沙箱路径 + OpenFileRequest sendRequest 成功拉起 WPS

UI 只在注册成功后再启用「打开文档」。注册未完成就 sendRequest 会抛异常,这是接口硬约束,不是业务层「打开失败」。

二、HAR 依赖怎么装进工程

oh-package.json5 声明本地 HAR:

{
  "dependencies": {
    "@wps/wps_sdk": "file:./libs/wps_sdk.har"
  }
}

将交付的 wps_sdk.har 放入 ./libs/,执行 ohpm install。换 HAR 批次后务必 clean 再编译,否则旧 native 产物会让「明明换了包仍鉴权失败」的判断失真。

导入保持与文档一致:

import {
  WPSApi,
  OpenFileRequest,
  Result,
  ResultCode,
  TransferType,
} from '@wps/wps_sdk';

调试包与上架包若 bundleName 不同,凭据通常要分别申请或明确以哪套为准。打包脚本建议打印一次包名,和申请材料并排归档。

三、registerApp:先就绪,再打开

对接文档要求:registerApp 回调未到 ResultCode.OK 之前调用 sendRequest 会抛异常。建议把回调收成可 await 的单出口,并在成功后按需注入激活序列号。

let wpsReady = false;

function ensureRegistered(
  appKey: string,
  appSecret: string,
  activationSn?: string
): Promise<void> {
  return new Promise((resolve, reject) => {
    if (wpsReady) {
      resolve();
      return;
    }
    WPSApi.registerApp(appKey, appSecret, {
      onCallback: (result: Result): void => {
        if (result.code === ResultCode.ERROR_CODE_AUTH_FAILURE) {
          reject(new Error(`1013: ${result.msg ?? ''}`));
          return;
        }
        if (result.code !== ResultCode.OK) {
          reject(new Error(`register ${result.code}: ${result.msg ?? ''}`));
          return;
        }
        if (activationSn && activationSn.length > 0) {
          WPSApi.setWpsFileToken(activationSn);
        }
        wpsReady = true;
        resolve();
      }
    });
  });
}

冷启动可在 Ability 初始化阶段 await ensureRegistered。Release 不要打印完整 appSecret。是否调用 setWpsFileToken 由构建配置决定:需要序列号的变体传真实值,不需要的变体传空即可跳过。

四、OpenFileRequest:沙箱路径 + 只读/可编辑

路径侧建议先把选择器文件拷到应用沙箱,再传给 OpenFileRequest。直接传外部 URI 时,权限不足常落到泛化 ResultCode.ERROR

import { common } from '@kit.AbilityKit';
import fs from '@ohos.file.fs';

function toSandbox(ctx: common.UIAbilityContext, src: string): string {
  const dir = `${ctx.filesDir}/wps_quick`;
  fs.mkdirSync(dir, true);
  const dest = `${dir}/${Date.now()}.docx`;
  fs.copyFileSync(src, dest);
  return dest;
}

async function openDocument(
  ctx: common.UIAbilityContext,
  src: string,
  editable: boolean
): Promise<Result> {
  await ensureRegistered(APP_KEY, APP_SECRET, ACTIVATION_SN_OR_EMPTY);
  const path = toSandbox(ctx, src);
  const request = new OpenFileRequest(ctx, path);
  request.enableEdit = editable; // 默认/false 只读;true 可编辑
  return WPSApi.sendRequest(request);
}
字段 快速接入常用取值
构造参数路径 本应用沙箱可读路径
enableEdit 预览 false;编辑 true
wpsTransferType 需要关窗回传时再开

预览与编辑共用同一打开函数,只差布尔参数,避免两套 Helper。回传与可编辑是独立开关,按入口语义组合。

五、最小联调顺序与错误码

推荐顺序:依赖可 import → 注册成功 → 沙箱只读打开 → 可编辑 →(可选)回传。一次堆满水印、extraOptions、落地相关字段,出了 ResultCode.ERROR 很难归因。

现象 优先排查
sendRequest 抛异常 registerApp 尚未成功
1013ERROR_CODE_AUTH_FAILURE appKey/appSecret、包名与申请是否一致
打开失败、参数不完整 路径是否为空、Context 是否有效
换 HAR 后行为异常 是否 clean;正式包 bundleName

联调日志建议同时打出 codemsg。调试包正常、正式包 1013,根因经常是正式包名与申请凭据不一致。

六、可复用的两入口封装

把「注册就绪」与「打开文档」拆成稳定 API,页面只调用它们:

export class WpsQuickFacade {
  private ready = false;

  async prepare(appKey: string, appSecret: string, sn?: string): Promise<void> {
    if (this.ready) {
      return;
    }
    await ensureRegistered(appKey, appSecret, sn);
    this.ready = true;
  }

  async open(
    ctx: common.UIAbilityContext,
    sandboxPath: string,
    enableEdit: boolean
  ): Promise<Result> {
    if (!this.ready) {
      throw new Error('call prepare first');
    }
    const req = new OpenFileRequest(ctx, sandboxPath);
    req.enableEdit = enableEdit;
    return WPSApi.sendRequest(req);
  }
}

后续要加水印或关窗回传,扩展 open 的可选参数即可,不要在多个页面复制 new OpenFileRequest

上线前再扫一遍:全仓 new OpenFileRequest 是否只剩一处、是否还在 Request 上逐次塞 wpsToken、Release 是否打印完整 secret、正式包包名与申请凭据是否一致。把这些写进 PR 模板,比口头说「已经接好了」更可靠。

快速接入阶段刻意不做的事同样重要:不要一次打开就写满水印、修订、extraOptions 与落地相关字段;不要为预览与编辑复制两套请求构造;不要在页面点击回调里直接 registerApp。能力按层叠加,失败才好归因。真机联调时建议固定日志格式:codemsg、当前是否 wpsReady、路径是否落在 filesDir 前缀下、本次是否赋值 enableEdit。这样排查「打不开」时,至少能分清是注册问题、路径问题还是策略问题。

若团队里已有 Demo 工程,迁移业务工程时优先搬 Facade,而不是搬按钮事件。Demo 常把注册与打开写在同一页,方便演示;业务侧冷启动连点、多页面重复注册、密钥散落会立刻出现。状态上至少区分依赖可 import、注册 OK、业务打开成功三层,UI 只在注册成功后启用打开入口。换 HAR 或换 flavor 后务必 clean,核对 bundleName 与申请材料一致,否则会出现调试包正常、正式包 1013。把这些节奏坚持几周,打开封装通常会从「多处拷贝」收敛到「一处 Facade」,联调时间也会从猜原因变成对表排查。字段语义仍以官方对接文档为准。

七、小结

鸿蒙侧 WPS Open SDK 的快速接入,可以压成四步:装好 HAR、等 registerApp 成功、文件进沙箱、用 OpenFileRequest 打开。工程上用 Facade 收敛调用,用联调顺序控制变量,比一次写满参数更稳。字段与错误码请以官方对接文档为准,随 SDK 版本核对。


基于 WPS Open SDK 鸿蒙版对接实践整理,仅供开发者参考。
官方对接文档:https://365.kdocs.cn/l/clQl5cek2NoT

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐