鸿蒙跳转微信/QQ:没有 App Linking 时的正确姿势
·
鸿蒙跳转微信/QQ:没有 App Linking 时的正确姿势
前言
“从我的 App 跳微信/QQ”是社区高频问题。很多人第一次尝试就失败,因为微信、QQ 的鸿蒙版没有向第三方开放 App Linking(基于 HTTPS 域名校验的官方拉起方案),而且不能用 bundleName 显式拉起——对方根本没导出供三方调用的 Ability 入口。本文梳理可用的替代链路,并指出最常见的误区。
问题描述
核心困境:
- 想跳微信/QQ 分享或加好友,但 App Linking 走不通(对方未开放);
- 有人贴出
startAbility({ bundleName: 'com.tencent.mqq', abilityName: 'EntryAbility' }),实测要么无效、要么看机型,属于不可靠写法; - 用
openLink拉weixin://报17700056,不知道是少了配置。
如果你只是“分享内容给好友”,官方最稳的是系统分享面板;如果是“跳主页/加好友”,目前没有官方入口,只能退回浏览器或复制口令(这是兜底方向,可优化 toast 提示)。
细节解析
鸿蒙的跨应用跳转有几条路径,按可靠性排序:
- Deep Linking(URL Scheme):微信
weixin://、QQmqq://在鸿蒙端注册了 Scheme,用openLink或隐式Want拉起,无需域名校验、无需 AGC 服务。但必须在module.json5的querySchemes声明,否则系统无法解析,报17700056。 - Share Kit 系统分享面板:通过
systemShare调起系统面板,自动列出已装可分享应用(含微信、QQ),用户点选即走,最稳。 - 微信 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。
更多推荐




所有评论(0)