【鸿蒙二开】WPS Open SDK 能力全景与参数映射

鸿蒙侧接 WPS Open SDK 时,建议把「能力」对齐到接口字段:注册、只读与可编辑、水印、extraOptions、关窗回传、以及不落地相关约束。先对照清楚再写封装,联调会少走弯路。本文用精简代码说明如何组合,方便社区同事对照工程落地。

能力对照

能力

字段

注册

RegisterAppRequest

序列号

setWpsFileToken

编辑

enableEdit=true

水印

WaterMark

关外发

OpenFileExtraOptions

回传

TransferType.URI/FD

落地

enableLocalization

先注册,再沙箱路径,再叠加策略。一次堆参难排查。

注册

未注册 sendRequest 会 reject;1013 查包名与凭据。

import { common } from '@kit.AbilityKit';
import {
  WPSApi,
  RegisterAppRequest,
  OpenFileRequest,
  OpenFileExtraOptions,
  WaterMark,
  TransferType,
  ResultCode,
  SdkConstants,
} from '@wps/wps_sdk';

let wpsReady = false;

async function ensureRegistered(ctx: common.UIAbilityContext): Promise<void> {
  if (wpsReady) return;
  const r = await WPSApi.sendRequest(
    new RegisterAppRequest(ctx, APP_KEY, APP_SECRET)
  );
  if (r.code === ResultCode.ERROR_CODE_AUTH_FAILURE) {
    throw new Error(`1013: ${r.msg ?? ''}`);
  }
  if (r.code !== ResultCode.OK) {
    throw new Error(`register ${r.code}`);
  }
  if (!SdkConstants.isPersonalSdk() && ACTIVATION_SN) {
    WPSApi.setWpsFileToken(ACTIVATION_SN);
  }
  wpsReady = true;
}

组合打开

import fs from '@ohos.file.fs';

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

async function openWithCapability(
  ctx: common.UIAbilityContext,
  src: string,
  opts: {
    editable: boolean;
    watermark?: string;
    transfer?: boolean;
    lockShare?: boolean;
  }
) {
  await ensureRegistered(ctx);
  const path = toSandbox(ctx, src);
  const req = new OpenFileRequest(ctx, path);
  req.enableEdit = opts.editable;

  if (opts.watermark) {
    const wm = new WaterMark();
    wm.Enable = true;
    wm.WaterMaskText = opts.watermark;
    wm.Angle = -30;
    wm.FontColor = '#19000000';
    wm.FontSize = 16;
    req.wpsWaterMarkParams = wm;
  }

  if (opts.transfer) {
    req.wpsTransferType = TransferType.URI;
  }

  if (opts.lockShare) {
    const extra = new OpenFileExtraOptions();
    extra.enableShare = false;
    extra.enableCloud = false;
    extra.enablePrint = false;
    extra.enableExport = false;
    req.extraOptions = extra;
  }

  const res = await WPSApi.sendRequest(req);
  if (res.code !== ResultCode.OK) {
    throw new Error(res.msg ?? String(res.code));
  }
  return res;
}

联调顺序:只读 → 可编辑 → 关分享 → 水印 → 回传。不落地模式下部分菜单可能被强制关闭,以真机为准。

回传注意

async function openAndCollect(ctx: common.UIAbilityContext, src: string) {
  const res = await openWithCapability(ctx, src, {
    editable: true,
    transfer: true,
    watermark: `${uid}|内部`,
    lockShare: true,
  });
  // 未关窗时可能没有 data,不要当失败
  if (!res.data?.fileUri) {
    return null;
  }
  const f = fs.openSync(res.data.fileUri, fs.OpenMode.READ_ONLY);
  const dest = `${ctx.filesDir}/wps_out/${Date.now()}.docx`;
  fs.mkdirSync(`${ctx.filesDir}/wps_out`, true);
  fs.copyFileSync(f.fd, dest);
  fs.closeSync(f);
  return dest;
}

OK && !data 多为未关窗。切回应用不等于关窗。

小结

能力全景 = 参数组合。把场景收成选项,页面只调统一入口。字段以官方文档为准。

鸿蒙侧刚开始梳理 WPS Open SDK 能力时,建议先把产品口头需求翻译成字段:打开、编辑、水印、关外发、回传、落地约束。对照清楚后再写封装,联调会少走弯路。

补充联调建议:小 docx / xlsx 各测一轮;换 HAR 后 clean;日志打 code/msg。菜单与预期不符时,先查不落地强制关闭,再查 extraOptions 是否赋值。页面不要散落多处 new OpenFileRequest,统一入口更稳。

真机回归至少覆盖:只读打开、可编辑、关分享、关窗回传。OK 且无 data 时先确认是否关文档窗。序列号用全局注入,不要每次 open 赋值。把能力对照表贴到项目 README,方便同事接手。

工程实践上,我还会固定几条约定:Preview / Edit 共用函数;策略参数只允许在打开模块赋值;页面禁止直接构造请求。Debug 与 Release 使用不同凭据文件,打包前打印 bundleName。把入口收束后,换 HAR、改 flavor 时回归范围更小,也更适合多人协作持续迭代鸿蒙 WPS 二开能力。

更多参数见官方对接文档:https://365.kdocs.cn/l/clQl5cek2NoT

申请 SDK HAR 与凭据:m_open_sdk@wps.cn(注明包名与接入需求)。

技术交流 QQ 群:628436767

湖北省
浏览 229
收藏
5
分享
5 +1
+1
全部评论