HarmonyOS鸿蒙Next中如何通过scheme打开自己app,然后app还需要接收参数

HarmonyOS鸿蒙Next中如何通过scheme打开自己app,然后app还需要接收参数 scheme的配置大概是mobile://cca/aab?canshu=123&canshu2=456

如果在浏览器输入这串,打开app并接收,浏览器支持吗,如果不支持,一个普通的h5页面支持吗

11 回复

这种《Deep Linking》的配置场景。地址栏输入时,有限支持;普通H5网页内跳转,支持。
以微信App(手机端和电脑端)为例,微信的scheme是weixin。
微信scheme获取,参考《获取目标应用的URL信息》

  1. 浏览器地址栏直接输入weixin://的方式:
    PC和手机要支持,得修改浏览器对自定义 scheme 的默认行为,这个不是对所有人适用。
    所以地址栏输入理论上可以,但限于浏览器本身的设定,所以不是100%。
  2. 网页页面内跳转方式:超链***和***window.open
    PC和手机都可以。跳微信示例,见附件html文件。下载到电脑或手机,去掉后缀.txt。
    手机上文件管理里。打开方式浏览器,就可以看跳转效果了。

PS:如果追求安全,看看《App Linking》

更多关于HarmonyOS鸿蒙Next中如何通过scheme打开自己app,然后app还需要接收参数的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


你好,可以看下这个文档:

使用Deep Linking实现应用间跳转https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/deep-linking-startup

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&amp;canshu2=456">打开App</a>

<!-- 或使用JavaScript -->
<button onclick="openApp()">点击打开App</button>
<script>
function openApp() {
    window.location.href = 'mobile://cca/aab?canshu=123&amp;canshu2=456';
}
</script>

⚠️ 重要限制:

  1. 必须由用户交互触发:不能在页面加载时自动跳转,必须由用户点击、触摸等操作触发
  2. 超时检测:需要设置超时检测,如果 app 未打开则跳转应用商店或提示
  3. 浏览器兼容性:不同浏览器支持程度不同
  4. 微信环境特殊处理:在微信中需要引导用户使用"在浏览器打开"

完整的 H5 实现方案

function openAppWithScheme() {
    const schemeUrl = 'mobile://cca/aab?canshu=123&amp;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. 微信小程序跳转

  • 如果目标是微信环境,考虑开发微信小程序
  • 使用微信官方提供的跳转方案

最佳实践建议

  1. 不要依赖单一方案:URL Scheme + Universal Links + 应用商店 fallback
  2. 用户引导:在不支持的环境中,清晰提示用户如何操作
  3. 参数安全性:对传递的参数进行验证和过滤,防止安全风险
  4. 测试覆盖:在各种浏览器和设备上充分测试

总结:在浏览器地址栏直接输入 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的onCreateonNewWant生命周期回调中,可以解析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;
        })
    }
  }
}

除了普通 scheme,其实 HarmonyOS NEXT 现在官方更推荐用 Deep Linking。

官方文档:

HarmonyOS Deep Linking 官方文档


你这个:

mobile://cca/aab?canshu=123&canshu2=456

本质就是 DeepLink 的一种。

HarmonyOS 支持:

  • 自定义 scheme
  • H5 拉起 APP
  • 浏览器跳转 APP
  • 参数传递
  • 未安装时跳转应用市场(App Linking)

实际最常见的是:

H5 页面:

window.location.href =
'mobile://cca/aab?canshu=123&canshu2=456'

或者:

<a href="mobile://cca/aab?canshu=123">打开APP</a>

点击后:

HarmonyOS 会尝试拉起对应 APP。


需要在 module.json5 配置:

"skills": [
  {
    "entities": [
      "entity.system.browsable"
    ],
    "actions": [
      "ohos.want.action.viewData"
    ],
    "uris": [
      {
        "scheme": "mobile",
        "host": "cca",
        "path": "aab"
      }
    ]
  }
]

APP 接收参数:

onCreate(want) {
  console.info(JSON.stringify(want.parameters))
}

即可获取:

canshu=123
canshu2=456

不过要注意:

直接浏览器地址栏输入:

mobile://xxx

不一定稳定。

很多浏览器会:

  • 拦截 scheme
  • 当成搜索词
  • 提示非法地址

所以:

真正线上一般都是:

  • H5按钮点击
  • JS跳转
  • App内Web页点击

而不是手输地址。


如果要做:

  • 未安装自动跳应用市场
  • 跨端统一链接
  • 更稳定的唤端

建议进一步使用官方 App Linking。

你App要配置监听scheme,文档查下

HarmonyOS的开发者模式提供了很多实用的工具,方便我们进行调试和优化。,

浏览器直接输入网址,不能跳转,如果是其他网站点击跳转新网页,如果这个网址与应用匹配,则会弹窗提示网站想要打开应用

在HarmonyOS Next中,通过module.json5abilities.skills配置自定义scheme(如myapp://),设置actions"ohos.want.action.viewData"。App在UIAbilityonNewWant()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中声明schememobilehostcca等。普通H5页面(Web组件加载)同样支持,点击链接或window.open均可触发,应用会通过Want接收。参数直接从want.uri中解析query部分获取,或在onNewWant回调中处理。

回到顶部