鸿蒙跳转微信/QQ:没有 App Linking 时的正确姿势

前言

“从我的 App 跳微信/QQ”是社区高频问题。很多人第一次尝试就失败,因为微信、QQ 的鸿蒙版没有向第三方开放 App Linking(基于 HTTPS 域名校验的官方拉起方案),而且不能用 bundleName 显式拉起——对方根本没导出供三方调用的 Ability 入口。本文梳理可用的替代链路,并指出最常见的误区。

问题描述

核心困境:

  • 想跳微信/QQ 分享或加好友,但 App Linking 走不通(对方未开放);
  • 有人贴出 startAbility({ bundleName: 'com.tencent.mqq', abilityName: 'EntryAbility' }),实测要么无效、要么看机型,属于不可靠写法;
  • openLinkweixin://17700056,不知道是少了配置。

如果你只是“分享内容给好友”,官方最稳的是系统分享面板;如果是“跳主页/加好友”,目前没有官方入口,只能退回浏览器或复制口令(这是兜底方向,可优化 toast 提示)。

细节解析

鸿蒙的跨应用跳转有几条路径,按可靠性排序:

  1. Deep Linking(URL Scheme):微信 weixin://、QQ mqq:// 在鸿蒙端注册了 Scheme,用 openLink 或隐式 Want 拉起,无需域名校验、无需 AGC 服务。但必须在 module.json5querySchemes 声明,否则系统无法解析,报 17700056
  2. Share Kit 系统分享面板:通过 systemShare 调起系统面板,自动列出已装可分享应用(含微信、QQ),用户点选即走,最稳。
  3. 微信 OpenSDK:专门用于微信/小程序跳转,需 ohpm i @tencent/wechat_open_sdk 并申请微信开放平台 AppId。QQ 无鸿蒙版 SDK,只能用 Deep Linking。

注意事项:

  • openLink 第二个参数 appLinkingOnly: false 才允许走 Scheme 跳转;
  • 系统会弹“是否允许跳转”确认框(不可取消);API 21 起可设 hideFailureTipDialog: true 关闭失败提示;
  • 跳转前用 bundleManager.canOpenLink('weixin://') 判断是否已安装,做降级处理;
  • 千万不要用 bundleName 显式拉起微信/QQ,对方没导出入口,调用必失败。

示例代码

Deep Linking 拉起微信(带安装判断与降级)

import { common, OpenLinkOptions, bundleManager } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';

function openWeChat(ctx: common.UIAbilityContext): void {
  const link = 'weixin://';
  let canOpen = false;
  try {
    canOpen = bundleManager.canOpenLink(link);
  } catch (err) {
    console.error(`canOpenLink failed: ${(err as BusinessError).message}`);
  }
  if (!canOpen) {
    // 引导用户去应用市场安装,或复制微信号
    return;
  }
  const opt: OpenLinkOptions = { appLinkingOnly: false };
  ctx.openLink(link, opt)
    .then(() => console.info('openLink success'))
    .catch((err: BusinessError) => console.error(`fail: ${err.code} ${err.message}`));
}

module.json5 必须声明:

{
  "module": {
    "querySchemes": ["weixin", "mqq"]
  }
}

Share Kit 系统分享面板(分享内容首选)

import { systemShare } from '@kit.ShareKit';
import { common } from '@kit.AbilityKit';
import { uniformTypeDescriptor as utd } from '@kit.ArkData';

function shareTo(ctx: common.UIAbilityContext, text: string): void {
  const data = new systemShare.SharedData({
    utd: utd.UniformDataType.PLAIN_TEXT,
    content: text
  });
  const controller = new systemShare.ShareController(data);
  controller.show(ctx, { previewMode: systemShare.SharePreviewMode.DETAIL });
}

隐式 Want 兜底写法

import { common, Want } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';

const ctx = getContext(this) as common.UIAbilityContext;
const want: Want = {
  action: 'ohos.want.action.viewData',
  uri: 'mqq://' // 或 'weixin://'
};
ctx.startAbility(want)
  .then(() => console.info('startAbility ok'))
  .catch((err: BusinessError) => console.error(`fail: ${err.code}`));

微信 OpenSDK 拉起小程序(仅微信)

import * as wxopensdk from '@tencent/wechat_open_sdk';
const WX_APP_ID = '你的微信开放平台AppId';
const WXApi = wxopensdk.WXAPIFactory.createWXAPI(WX_APP_ID);

if (WXApi.isWXAppInstalled()) {
  const req = new wxopensdk.LaunchMiniProgramReq();
  req.userName = '小程序原始id';
  req.path = '页面路径';
  req.miniprogramType = 0; // 0=正式版
  WXApi.sendReq(getContext(this), req);
}

总结

跳转微信/QQ 没有 App Linking 可用时,优先:分享内容用 Share Kit;拉起 App 用 Deep Linking(openLink + querySchemes;微信小程序用 OpenSDK。核心避坑:别用 bundleName 显式拉起(必失败)、别忘了 querySchemes、跳转前 canOpenLink 判断安装、destroy/close 之外别忘了 API 21 的 hideFailureTipDialog。QQ 无鸿蒙 SDK,只能走 Scheme。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐