HarmonyOS鸿蒙Next中如何通过scheme打开自己app,然后app还需要接收参数
HarmonyOS鸿蒙Next中如何通过scheme打开自己app,然后app还需要接收参数 scheme的配置大概是mobile://cca/aab?canshu=123&canshu2=456
如果在浏览器输入这串,打开app并接收,浏览器支持吗,如果不支持,一个普通的h5页面支持吗
这种《Deep Linking》的配置场景。地址栏输入时,有限支持;普通H5网页内跳转,支持。
以微信App(手机端和电脑端)为例,微信的scheme是weixin。
微信scheme获取,参考《获取目标应用的URL信息》。
- 浏览器地址栏直接输入weixin://的方式:
PC和手机要支持,得修改浏览器对自定义 scheme 的默认行为,这个不是对所有人适用。
所以地址栏输入理论上可以,但限于浏览器本身的设定,所以不是100%。 - 网页页面内跳转方式:超链***和***window.open
PC和手机都可以。跳微信示例,见附件html文件。下载到电脑或手机,去掉后缀.txt。
手机上文件管理里。打开方式浏览器,就可以看跳转效果了。
PS:如果追求安全,看看《App Linking》。
更多关于HarmonyOS鸿蒙Next中如何通过scheme打开自己app,然后app还需要接收参数的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
URL Scheme 基本原理
您提到的 scheme 格式 mobile://cca/aab?canshu=123&canshu2=456 是标准的深度链接格式,其中:
mobile://是自定义协议头cca/aab是路径,用于指定应用内的具体页面?canshu=123&canshu2=456是查询参数,用于传递数据
浏览器直接输入支持情况
不完全支持,具体情况如下:
✅ 支持的情况:
- 原生系统浏览器(如 Safari、Chrome)在某些版本中支持
- 需要用户手动输入完整的 scheme URL
- 但现代浏览器出于安全考虑,限制越来越严格
❌ 不支持/受限的情况:
- 微信浏览器:会拦截大部分自定义 scheme,显示"无法打开网页"
- QQ浏览器:同样会限制 scheme 唤起
- 其他内置浏览器:如微博、抖音等内置浏览器通常不支持
- 安全策略:现代浏览器要求 scheme 唤起必须由用户交互触发(如点击按钮),不能直接在地址栏输入或自动跳转
普通 H5 页面支持情况
部分支持,但有条件限制:
✅ 可行的方案:
<!-- 通过用户点击触发 -->
<a href="mobile://cca/aab?canshu=123&canshu2=456">打开App</a>
<!-- 或使用JavaScript -->
<button onclick="openApp()">点击打开App</button>
<script>
function openApp() {
window.location.href = 'mobile://cca/aab?canshu=123&canshu2=456';
}
</script>
⚠️ 重要限制:
- 必须由用户交互触发:不能在页面加载时自动跳转,必须由用户点击、触摸等操作触发
- 超时检测:需要设置超时检测,如果 app 未打开则跳转应用商店或提示
- 浏览器兼容性:不同浏览器支持程度不同
- 微信环境特殊处理:在微信中需要引导用户使用"在浏览器打开"
完整的 H5 实现方案
function openAppWithScheme() {
const schemeUrl = 'mobile://cca/aab?canshu=123&canshu2=456';
const startTime = Date.now();
// 创建iframe方式(兼容性更好)
const iframe = document.createElement('iframe');
iframe.style.display = 'none';
iframe.src = schemeUrl;
document.body.appendChild(iframe);
// 超时检测(2秒内未打开则认为失败)
setTimeout(() => {
const endTime = Date.now();
if (endTime - startTime < 2000) {
// 可能成功打开了app
console.log('App opened successfully');
} else {
// 打开失败,跳转应用商店或提示
if (isWeChatBrowser()) {
alert('请在浏览器中打开');
// 跳转到应用商店页面
window.location.href = 'https://your-app-download-page.com';
} else {
// 尝试直接打开应用商店
window.location.href = 'https://apps.apple.com/app/id123456'; // iOS
// 或
window.location.href = 'https://play.google.com/store/apps/details?id=com.yourapp'; // Android
}
}
document.body.removeChild(iframe);
}, 2000);
}
// 检测是否为微信浏览器
function isWeChatBrowser() {
return /MicroMessenger/i.test(navigator.userAgent);
}
更现代的替代方案
由于 URL Scheme 限制较多,建议同时实现以下方案:
1. Universal Links (iOS) / App Links (Android)
- 使用 https 链接,更安全可靠
- 无需用户确认,直接打开 app
- 需要在服务器配置关联文件
2. 微信小程序跳转
- 如果目标是微信环境,考虑开发微信小程序
- 使用微信官方提供的跳转方案
最佳实践建议
- 不要依赖单一方案:URL Scheme + Universal Links + 应用商店 fallback
- 用户引导:在不支持的环境中,清晰提示用户如何操作
- 参数安全性:对传递的参数进行验证和过滤,防止安全风险
- 测试覆盖:在各种浏览器和设备上充分测试
总结:在浏览器地址栏直接输入 scheme 的方式在现代浏览器中不推荐且支持度有限,建议通过 H5 页面的用户交互来触发,并做好兼容性和 fallback 处理。
肯定支持啊,在HarmonyOS系统的浏览器(或兼容的WebView)地址栏直接输入完整的Scheme链接,如mobile://cca/aab?canshu=123&canshu2=456,系统会尝试匹配已安装的应用并拉起。实际体验可能因浏览器版本或系统设置略有差异,例如可能需要用户确认是否打开应用。
另外在需要被拉起的应用的module.json5文件中,对应Ability的skills字段内配置支持的URI协议。以你说的Scheme mobile://cca/aab?canshu=123&canshu2=456为例,配置示例如下:
{
"module": {
"abilities": [
{
"name": "EntryAbility",
"srcEntry": "./ets/entryability/EntryAbility.ets",
"exported": true, // 必须设置为true,否则无法被拉起
"skills": [
{
"entities": ["entity.system.browsable"], // 支持浏览器或Web组件拉起
"actions": ["ohos.want.action.viewData"], // 视图数据动作
"uris": [
{
"scheme": "mobile", // 协议头
"host": "cca", // 主机名
"path": "aab" // 路径(可选)
}
]
}
]
}
]
}
}
然后接受参数:
你的参数会通过Want对象传递。在Ability的onCreate或onNewWant生命周期回调中,可以解析URI并获取查询参数
import { AbilityConstant, UIAbility, Want } from "@kit.AbilityKit";
import { hilog } from "@kit.PerformanceAnalysisKit";
import { url } from "@kit.ArkTS";
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
// 获取传入的URI
let uri = want?.uri;
if (uri) {
try {
// 解析URL对象
let urlObject = url.URL.parseURL(uri);
// 获取具体参数值
let canshu = urlObject.params.get("canshu"); // "123"
let canshu2 = urlObject.params.get("canshu2"); // "456"
// 根据参数执行后续业务逻辑
} catch (error) {
hilog.error(0x0000, "EntryAbility", "Failed to parse URL.");
}
}
}
}
最后就是你说的h5,也是可以的,通过以下两种方式触发Scheme拉起应用:
使用a标签:<a href="mobile://cca/aab?canshu=123&canshu2=456">打开应用</a>
使用JavaScript:location.href = "mobile://cca/aab?canshu=123&canshu2=456";
不过为确保拉起流程可控(如处理应用未安装的情况),建议在嵌入H5的ArkTS页面中配合Web组件进行拦截与处理:
import { webview } from '@kit.ArkWeb';
import { bundleManager } from '@kit.BundleManagerKit';
import { common, Want, BusinessError } from '@kit.AbilityKit';
@Entry
@Component
struct WebPage {
controller: webview.WebviewController = new webview.WebviewController();
build() {
Column() {
Web({ src: $rawfile('yourH5.html'), controller: this.controller })
.onLoadIntercept((event) => {
if (event) {
let url: string = event.data.getRequestUrl();
// 检测是否为自定义Scheme
if (url.startsWith('mobile://')) {
// 检查是否可打开该链接(应用是否安装)
let canOpen = bundleManager.canOpenLink(url);
if (canOpen) {
let want: Want = { uri: url };
let context = this.getUIContext().getHostContext() as common.UIAbilityContext;
context.startAbility(want, (err: BusinessError) => {
if (err.code) {
console.error(`startAbility failed: ${err.message}`);
}
});
} else {
// 应用未安装,可引导用户跳转至应用市场
// 示例:跳转到华为应用市场
let marketWant: Want = {
uri: `store://appgallery.huawei.com/app/detail?id=你的应用包名`
};
let context = this.getUIContext().getHostContext() as common.UIAbilityContext;
context.startAbility(marketWant);
}
return true; // 拦截请求,避免Web组件继续加载该链接
}
}
return false;
})
}
}
}
你App要配置监听scheme,文档查下
HarmonyOS的开发者模式提供了很多实用的工具,方便我们进行调试和优化。,
浏览器直接输入网址,不能跳转,如果是其他网站点击跳转新网页,如果这个网址与应用匹配,则会弹窗提示网站想要打开应用

在HarmonyOS Next中,通过module.json5的abilities.skills配置自定义scheme(如myapp://),设置actions为"ohos.want.action.viewData"。App在UIAbility的onNewWant()或onCreate()中接收Want对象,通过want.uri解析参数(如myapp://path?key=value),或通过want.params获取额外参数。
在HarmonyOS NEXT中,通过URL Scheme打开应用并接收参数是支持的。系统浏览器输入类似mobile://cca/aab?canshu=123&canshu2=456的链接,能够拉起已注册该scheme的应用,前提是在module.json5中为对应UIAbility配置了ohos.want.action.viewData的action,并在uris中声明scheme为mobile、host为cca等。普通H5页面(Web组件加载)同样支持,点击链接或window.open均可触发,应用会通过Want接收。参数直接从want.uri中解析query部分获取,或在onNewWant回调中处理。


