系列文章《鸿蒙开发从入门到专家》第 36 篇 · 高级
做鸿蒙 App 的运营同学绕不开一个问题:现在很多业务在小程序里跑着,App 主要承担"留量"。但小程序只能覆盖一部分用户,App 又是主要的留存载体。两边怎么通?跨端跳转、数据互通、统一账户——这都需要开发配合运营一起做。
这一篇把鸿蒙应用和"小程序/快应用/原子化服务"整合的几个落地动作整理清楚。题目虽然有点"产品向",但代码细节不少。
一、先理解三方关系
你会发现,这些都是独立的运行时。它们都没有"互相调用"的天然能力,只能通过"URL 跳转 + 自定义协议"做能力衔接。
二、跳转:从 App 到小程序
鸿蒙应用启动微信小程序,调用 startAbility 加上 want 配置:
import { wantConstant } from '@kit.AbilityKit';
function openWeixinMiniProgram(ghId: string, path: string = '') {
const want = {
bundleName: 'com.tencent.mm',
abilityName: 'MainAbility',
action: 'android.intent.action.VIEW',
uri: `weixin://dl/business/?appid=${ghId}&path=${encodeURIComponent(path)}`,
};
startAbility(want).catch((err) => {
console.warn('微信未安装或跳转失败', err.code);
});
}
注意几个坑:
未安装兜底:用户没装微信会报错,建议降级到浏览器或应用商店。
微信版本要求:低版本微信不支持小程序跳转 schema。
iOS 不支持同协议:鸿蒙和 iOS 的 URL Scheme 大小写敏感不同,记得测试。
支付宝小程序类似:
function openAlipayMiniProgram(appId: string, path: string = '') {
const uri = `alipays://platformapi/startapp?appId=${appId}&page=${encodeURIComponent(path)}`;
startAbility({ bundleName: 'com.eg.android.AlipayGphone', uri });
}
三、从外部跳回 App:URL Scheme
从短信、邮件、二维码跳回鸿蒙 App,需要注册 URL Scheme(自定义协议)。在 resources/base/profile/main_pages.json 或 module.json5 中:
{
"abilities": [
{
"name": "EntryAbility",
"srcEntry": "./ets/entry/EntryAbility.ets",
"actions": ["action.system.home"],
"uris": [
{
"scheme": "myapp",
"host": "open",
"path": "product"
}
]
}
]
}
scheme://host/path 三段组成了完整协议。访问 myapp://open/product?id=123 系统会启动 App,并触发 onCreate 或 onNewWant。
接收端代码:
// EntryAbility.ets
export default class EntryAbility extends UIAbility {
onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {
const uri = want.uri;
if (uri && uri.startsWith('myapp://')) {
const u = new URL(uri);
const path = u.pathname.replace(/^\//, '');
const params = Object.fromEntries(u.searchParams);
// 分发到对应页面
Router.pushUrl({ url: `pages/${capitalize(path)}`, params });
}
}
}
注意:
scheme 名建议带反钓鱼策略(不要直接用产品名)。
大小写在鸿蒙/微信里不同表现,最好用 lowercase。
Ability配置完成后必须让运营/前端共同验证一遍,跨客户端跳错很常见。
四、快应用跳转
快应用是手机厂商联盟(华为、小米、OPPO、vivo、魅族)共建的轻量形态。鸿蒙里跳转需要走 QuickApp 协议:
function openQuickApp(packageName: string, path: string, params: object) {
const uri = `quickapp://${packageName}${path}?${new URLSearchParams(params).toString()}`;
startAbility({ bundleName: 'com.huawei.fastapp', uri });
}
用户没装快应用中心时不会跳转成功,要做好兜底——比如跳到快应用网页版或运营引导页。
五、跨端账户体系
账号体系往往是最复杂的整合环节。三套独立的体系:鸿蒙 App、小程序、快应用。要做到"一个用户",通常有两条思路:
1. 服务端统一 ID
最常见。三个端共用一个后端用户服务,通过 unionId 关联账号:
// 统一登录 SDK(伪代码)
async function ssoLogin(channel: 'app' | 'mini' | 'quick'): Promise<User> {
const token = await loginChannel[channel](); // 不同渠道不同的登录方式
const user = await api.post('/sso/login', { channel, token });
return user;
}
前端差异只在登录方式(App 端用账号密码/手机号,小程序用 wx.login(),快应用用 hmplogin),登录后做 unionId 匹配。
2. OpenHarmony 的统一账户
依赖系统级别的账号,调用 @ohos.account.osAccount,但这只在鸿蒙内有效,跨不到微信小程序。要做到完全跨端,必须走服务端。
3. 数据互通:常用做法
六、引流与回流
拉新和促活是个运营动作,但要技术配合实现。常见的几类:
1. App → 小程序
用 banner / 弹窗引导。小程序的好处是免下载,新客转化率高。
// 启动后第一天展示邀请弹窗
function shouldShowInvite() {
const lastShown = LocalStorage.get('invite_shown');
if (lastShown) return false;
return Account.daysFromRegister() <= 7;
}
2. 小程序 → App
微信里最常见,分享卡片里放"打开 App"按钮。用户点击跳转:
<!-- 微信小程序 wxml -->
<button open-type="launchApp" app-parameter="myapp://open/product?id=123">打开 App</button>
注意:这个能力要求 App 和小程序必须关联同一个微信开放平台。
3. App → 快应用
鸿蒙支持把快应用固定到桌面。通过快应用码直接拉起:
function bindQuickAppToDesktop(quickAppId: string) {
startAbility({
bundleName: 'com.huawei.fastapp',
abilityName: 'com.huawei.fastapp.MainAbility',
uri: `quickapp://${quickAppId}`,
});
}
七、案例:电商超级 App 的多端整合方案
某电商 App 的整合形态:
统一账户用 unionId,所有端共用一个会员中心。
数据统计统一回流到数据中台,按渠道拆分。
业务路由统一走服务端配置,App 内"打开小程序""拉起快应用"的逻辑都在配置里。
整合后效果:
一个用户首次触达可能在微信小程序,注册后引导下载 App。
用户在 App 下单,分享到微信时直接生成小程序卡片。
桌面卡片在双11期间直接出"今日爆款",点击进原子化服务。
每条路径都有专门的数据埋点和归因模型,技术 + 运营联动才能跑出效果。
小结
鸿蒙和小程序/快应用的整合是一道跨边界的工程题:
跳转:URL Scheme 是基础,但要做好兜底。
账户:服务端统一 unionId 是主流方案。
数据:业务由后端合并,前端只展示。
运营:技术为引流/回流铺路,但运营负责定义路径。
下一篇我们要换话题——工程化角度讲鸿蒙应用怎么接入企业级 CI/CD,从签名到灰度发布一条流水线搭起来。
参考阅读
鸿蒙开发者文档《Want 与 Ability 调起》
鸿蒙开发者文档《快应用接入指南》
微信开放平台《小程序跳转 App 能力说明》
《小程序从 0 到 1》(思路参考)